首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

Pro Android学习札记(四一):Fragment(6):数据保留

2013-10-16 
Pro Android学习笔记(四一):Fragment(6):数据保留在Fragment的生命周期中的Bundle savedInstanceState是用

Pro Android学习笔记(四一):Fragment(6):数据保留

在Fragment的生命周期中的Bundle savedInstanceState是用于保存fragment状态,而不是fragment的相关数据。我们今天要解决的问题是,通过fragment,横竖屏切换时,如何保留关键数据。

当屏幕进行切换时,activity将退出,重新create,我们希望屏幕转向时,仍能看到原来的数据。诚然有很多方式,例如在app中,通过其他静态参数保留,通过本地存储保留等等。我们可以简单地利用fragment的参数进行关键数据保留。本例中的关键数据为书面的序号,故需要TitleFragment将其作为参数进行保存,系统在自动保存fragment的参数,在下次create时获取。

Pro Android学习札记(四一):Fragment(6):数据保留

对TitleFragment进行修改

public class TitleFragment extends ListFragment{
    private int mCurCheckPosition = -1;
   … 略 … 

    public void onListItemClick(ListView l, View v, int position, long id) { 
        mCurCheckPosition = position;
        myActivity.showDetails(mCurCheckPosition);
        Bundle b = getArguments();
        if(b != null){
            b.putInt("index", mCurCheckPosition);  //更新参数
        }
    }     
     
    public void onInflate(Activity activity, AttributeSet attrs, Bundle savedInstanceState) {
       //如果参数不存在,设置参数,如果参数存在,获取参数。    
        Bundle b = getArguments();
        if(b != null){
            mCurCheckPosition = b.getInt("index", -1); 
        }else{
            b = new Bundle();
            b.putInt("index", mCurCheckPosition);
            setArguments(b);
        }
        super.onInflate(activity, attrs, savedInstanceState);
    }
   
}

至此,在横屏切换到竖屏中,我们可以直接进入相应的书目简介内容中。在切换时,系统在一个保存状态(saved state)中重新创建(re-create) fragment,这时缺省的构造函数函数被调用,带有初始化参数bundle。此外,对于参数设置,如本例设置“index”参数应在onAttach之前进行,即在onInfalte状态或构造函数中进行,注意,不是每个flagment都有onInfalte状态。

对DetailActivity进行修改

通过参数保存,从横屏到竖屏符合预期,从竖屏(目录)切换到横屏符合预期,但是从竖屏(简介)切换到横屏不符合预期,只是将DetailsActivity转向,对DetailsActivity的修改如下。当检测到屏幕为横屏时退出即可。

public class DetailActivity extends Activity{
    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE ){
            finish();
            return;
        }
           
        Intent intent = getIntent();
        if(intent == null){
            finish();
            return;
        }         
        DetailFragment detail = DetailFragment.newInstance(intent.getExtras());
        getFragmentManager().beginTransaction()
            .add(android.R.id.content, detail)
            .commit();       
    }
}

相关链接: 我的Android开发相关文章

热点排行