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

我们有时候会发现,由竖屏切到横屏的时候,会出现问题,比如数据丢失,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数据。


你可能感兴趣的:(ListView)