Android中自定义View的状态保存
2016-06-28 16:02
597 查看
记得我在一次面试中遇到的一个问题是,关于自定义View中,View的保存状态问题。
做过自定义View的开发人员应该都遇到过这种问题,因为Activity转屏,或者是Home键到后台时都很容易在被系统销毁,恢复时我们肯定是希望看到View保留着之前的状态。
而Android中有一套标准的做法,我们可以从Android自带的控件里看到。比如说TextView的源代码( SavedState extends BaseSaveState):
/**
* User interface state that is stored by TextView for implementing
* {@link View#onSaveInstanceState}.
*/
public static class SavedState extends BaseSavedState {
int tart;
int end;
CharSequence text;
boolean frozenWithFocus;
CharSequence error;
做过自定义View的开发人员应该都遇到过这种问题,因为Activity转屏,或者是Home键到后台时都很容易在被系统销毁,恢复时我们肯定是希望看到View保留着之前的状态。
而Android中有一套标准的做法,我们可以从Android自带的控件里看到。比如说TextView的源代码( SavedState extends BaseSaveState):
/**
* User interface state that is stored by TextView for implementing
* {@link View#onSaveInstanceState}.
*/
public static class SavedState extends BaseSavedState {
int tart;
int end;
CharSequence text;
boolean frozenWithFocus;
CharSequence error;
SavedState(Parcelable superState) { super(superState); } @Override public void writeToParcel(Parcel out, int flags) { super.writeToParcel(out, flags); out.writeInt(start); out.writeInt(end); out.writeInt(frozenWithFocus ? 1 : 0); ...... BaseSavedState是View的一个内部静态类,从代码上我们可以知道是吧控件的属性(如start)打包到Parcel容器,Activity的onSaveInstanceState、onRestoreInstanceState最后也会调用到控件的这2个同名方法。 下面是关于Activity状态的保存: Activity的状态 (https://img-blog.csdn.net/20160628153028522) 注意:我们无法保证系统会在销毁Activity前一定调用onSaveInstanceState,例如用户的行为是在显示关闭Activity,比如说,在使用返回键退出Activity时,由于用户的行为是在显示关闭Activity,所以不会调用onSaveInstanceState. 那么,如果系统调用onSaveInstanceState,它是在onStop还是onPause之前执行呢? 答案是肯定在调用onStop之前,但是不是在onPause之前就不能确定了,需要看情况而定。 总结: Activty类的onSaveInstanceState默认实现会恢复Activity的状态。默认实现会为布局中的每一个View调用相应的onSaveInstanceSate方法,让每一个View都能保存自身的信息。 这里需要注意一个细节:想要保存View的状态,需要在XML布局文件中提供一个唯一的ID(android:id),如果没有设置这个ID的话,View控件的onSaveInstanceState是不会被调用的。
相关文章推荐
- RecyclerView总结学习(二)
- Android控件之SeekBar 设置最小值非零
- Android提高Service优先级的方法分析
- android EventBus 3.0 混淆配置
- 如何在onCreate里面绘制View宽高
- Android 自定义RecyclerView 实现真正的Gallery效果
- Android——操作摄像头、图片合成
- android GPS 定位
- Android中使用Canvas绘制简单的图形(一)
- Android中persistent属性用法详解
- Android vold启下篇(NetlinkHandler)
- Android BottomSheet:以选取图片为例(2)
- Android BottomSheet:以选取图片为例(2)
- Android自定义ScrollView实现一键置顶功能
- Android studio 提高导入项目的速度
- Android开发技巧:像QQ一样输入表情图像
- Android 下拉展开动画
- android(七)、 ContextImpl创建
- AndroidStudio快捷键大全
- 如何将Android Studio项目提交(更新)到github作为远程仓库