Android 横竖屏切换总结

首先,说一些常规的Activity的横竖屏切换的生命周期,如果没有在Manifests中特殊标明的话会重新生成一个全新的.

Activity,如果有在Manifests中声明configChange的话会走onConfigChange的回调,并且不会重新创建Activity, 其实是不建议使用这种方式来实现,因为除了横竖屏切换,语言切换等其他的case也有可能会导致Activity的重建,而开发者很有可能会遗漏某个,导致发生Acitivity重新创建,进而发生一些没有意料到的问题.

这个时候我们其实可以使用fragment来屏蔽这些Activity重建导致的问题,

方法就是,将UI的控件都放到一个fragment中,再将这个fragment附着在Activity上,并且在fragment中setRetainInstance为true,下面用一张图来描述一下这个方法的作用


Android 横竖屏切换总结_第1张图片

如上图所示, setRetainInstance这个方法正是控制是否保留的方法,也就是说如果为true的话Activity还依然会重建,但是Fragment不会重建,但是会重新绘制界面,这就可以保证我们的数据是不会由于重建而丢失.并且fragment也含有onSaveInstanceState回调可以进行状态的保存,.但是需要注意的是fragment没有恢复的onRestoreInstanceState函数,通过上面的图,我们可以推测出onActivityCreated()中应该是可以区分,是由于Activity重绘之后被调用,还是新创建时被调用,

果然, 系统原生的DialogFragment中onActivityCreated方法中的就有这样的代码

if (savedInstanceState != null) {

    Bundle dialogState = savedInstanceState.getBundle(SAVED_DIALOG_STATE_TAG);

    if(dialogState != null) {

        mDialog.onRestoreInstanceState(dialogState);

    }

}

可见savedInstanceState 不为空时意味着是发生了重绘,需要恢复状态

另外一些系统的View已经为我们做了状态的保存,不需要我们在进行状态的保存

TextView 不会保存状态,看源码可知是由freezesText

这个属性来控制是否保存,如果手动保存状态,最好不要记录String而是记录CharSequence(中英文切换)

EditView 可以保存状态,但是会走回调

CompoundButton Check状态会保存, 但是会走回调, Text内容同TextView,

ImageView 不会保存任何信息

seekBar 会保存进度信息.但是会走回调

View的生命周期中也会有onSaveInstanceState的回调,具体的控件是否支持横竖屏旋转保存状态,可以看源码中是否在这个回调中进行状态保存(一般重写该方法的都是支持的),在我们自定义控件的时候其实也应该考虑到这一部分

你可能感兴趣的:(Android 横竖屏切换总结)