横竖屏切换 利用onSaveInstanceState来保存数据

来源:互联网 发布:写编程到底什么意思 编辑:程序博客网 时间:2024/06/10 13:00

我们有时候会发现,由竖屏切到横屏的时候,会出现问题,比如数据丢失,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;这个时候就要走正确的逻辑,不需要重新初始化,导致某些操作丢失。

一个保存数据的x小Demo

我们通过一个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对应上,这样问题就解决了,最后附上源码:

横竖屏保存ListView数据。


0 0