Android 横竖屏切换总结

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

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

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

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


如上图所示, 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的回调,具体的控件是否支持横竖屏旋转保存状态,可以看源码中是否在这个回调中进行状态保存(一般重写该方法的都是支持的),在我们自定义控件的时候其实也应该考虑到这一部分

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容