我们有时候会发现,由竖屏切到横屏的时候,会出现问题,比如数据丢失,Fragemnt 重叠现象。这是由于横竖屏切换,OnCreate会重新走一遍。为了解决这个问题我们必须重写这个方法,并且保存数据在OnCreate里重新拿到。
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
outState.putBoolean("changeScreen", true);
Log.e(Tag, "-------onSaveInstanceState");
}
在这里我们做横竖屏切换的时候,保存一个Boolean值,从而考虑在OnCreate怎么走逻辑,如下:
if (savedInstanceState == null) {
Log.e(Tag, "-------onCreate--------"+savedInstanceState);
}else{
Log.e(Tag, "-------onCreate--------"+savedInstanceState.getBoolean("changeScreen"));
}
如果这个Activity 第一次启动,那么savedInstanceState== null,时候做初始化的操作,若做了横竖屏的切换,那savedInstanceState != null;这个时候就要走正确的逻辑,不需要重新初始化,导致某些操作丢失。
我们通过一个ListView 中点击Checkbox 例子来学习如何在实战中,保存数据。我曾经写过一个Checkbox选中状态,滑动混乱的Demo,ListView中Checkbox点击,滑动状态混乱,比如我们切换横屏的话,之前选中的CheckBox 都不在显示,因为切换的时候OnCreate 重新创建了Adapter,不会再有被点击的记录,这个时候我们需要在Activity中重写
onSaveInstanceState,如下:
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
outState.putSerializable("select", checkBoxAdapter);
}
直接保存了该CheckboxAdapter,然后在OnCreate中这样写:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = $(R.id.list);
if(savedInstanceState == null)
{
checkBoxAdapter = new CheckBoxAdapter(getApplicationContext());
list.setAdapter(checkBoxAdapter);
}
else
{
checkBoxAdapter = (CheckBoxAdapter)savedInstanceState.getSerializable("select");
list.setAdapter(checkBoxAdapter);
}
}
若,第一次进来,则初始化Adapter,若切换横竖屏,直接拿到保存的Adapter对象,重新与ListView对应上,这样问题就解决了,最后附上源码: