目录(?)[-]

  1. 通过fragment参数实现数据保留
    1. 对TitleFragment进行修改
    2. 对DetailActivity进行修改
  2. 通过savedInstanceState进行数据保留
  3. 保留fragment实例

在横屏竖屏切换时,activity将保留状态,退出,然后重新创建。我们今天要解决的问题是,通过fragment,横竖屏切换时,如何保留关键数据。在Fragment的生命周期中的Bundle savedInstanceState是用于保存fragment状态,此外,还可以使用fragment参数进行数据的保留。

通过fragment参数实现数据保留

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

对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();        
    } 
}

通过savedInstanceState进行数据保留

在横竖屏切换中,在onPause()状态后,fragment的生命周期会进入onSaveInstanceState()状态,我们可以在此状态中将所需的数据让如fragment的状态(bundle)中保持,如下所示,我们以保存书名信息为例子。当系统认为需要进行状态时会调用onSaveInstanceState(),通常在onPause()后,当也可以发生在onDestroy()之前的其他时间。

public void onSaveInstanceState(Bundle outState) {
        if(mCurCheckPosition > 0)
            outState.putString("Book", BooksInfo.TITLES[mCurCheckPosition]);
        else
            outState.putString("Book", null);
        super.onSaveInstanceState(outState);
    }

当fragment重新创建,在若干生命周期状态中都可以读取,例如:

  1. public void onInflate(Activity activity, AttributeSet attrs,Bundle savedInstanceState) {
  2. if(savedInstanceState != null){
  3. showInfo("**** book is " + savedInstanceState.getString("Book"));
  4. }
  5. ... 略 ...
  6. super.onInflate(activity, attrs, savedInstanceState);
  7. }
  8. public void onCreate(Bundle bundle) {
  9. super.onCreate(bundle);
  10. if(bundle != null){
  11. showInfo("**** book is " + bundle.getString("Book"));
  12. }
  13. }

保留fragment实例

在fragment的生命周期图中,有虚线的部分,从onDestroyView回到onCreateView状态,这是保留fragment实例,但测试场景,我没能找到进行验证。下面是保留fragment实例的实现方式:

  1. public void onCreate(Bundle bundle) {
  2. super.onCreate(bundle);
  3. setRetainInstance(true);//设置true,表明在存储中保留fragment对象。
  4. }

由于将返回onCreateView()状态,合适的设置位置在onCreate()中。这种情况要求fragment不在back stack中,尤其适合于没有UI的fragment,当activity被destroy并重建时,fragment仍在app中,其onDestroy()以及onCreate()并不会被调用,onDetach()和onAttach()、onActivityCreated()会被调用,因为需要关联到新的activity中。

本博文涉及的例子代码,可以在Pro Android学习:Fragment中下载。

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

【转】 Pro Android学习笔记(四一):Fragment(6):数据保留的更多相关文章

  1. 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

    目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...

  2. 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版

    目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...

  3. 【转】 Pro Android学习笔记(五六):配置变化

    目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...

  4. Pro Android学习笔记 ActionBar(1):Home图标区

     Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...

  5. 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...

  6. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  7. 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode

    目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...

  8. 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式

    可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...

  9. 【转】 Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单

    目录(?)[-] 利用XML创建菜单 XML的有关属性 onClick事件 Pop-up菜单 利用XML创建菜单 在代码中对每个菜单项进行设置,繁琐且修改不灵活,不能适配多国语言的要求,可以利用资源进 ...

  10. 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单

    目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...

随机推荐

  1. Python的自省机制

    什么是自省? 在日常生活中,自省(introspection)是一种自我检查行为. 在计算机编程中,自省是指这种能力:检查某些事物以确定它是什么.它知道什么以及它能做什么.自省向程序员提供了极大的灵活 ...

  2. SQLite支持的并发访问数

    SQLite objects created in a thread can only be used in that same thread.The object was created in th ...

  3. 常见数据挖掘算法的Map-Reduce策略(2)

           接着上一篇文章常见算法的mapreduce案例(1)继续挖坑,本文涉及到算法的基本原理,文中会大概讲讲,但具体有关公式的推导还请大家去查阅相关的文献文章.下面涉及到的数据挖掘算法会有:L ...

  4. ACN经典例题1

    1.韩信点兵 描述相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了.输入3个非负整数a,b,c ,表示每种 ...

  5. TCP标准模板

    伪代码 #创建一个TCP服务器 ss = socket() #创建服务器套接字 ss.bind() #把地址绑定到套接字上 ss.listen() #监听连接 inf_loop: #服务器无线循环 c ...

  6. 【二】MongoDB入门

    下面是mongodb的一些基本概念: 文档是MongoDB中数据的基本单元,类似关系数据库中的行. 集合,是存储文档的容器,类似关系数据库中的表. MongoDB的单个实例容纳多个数据库,每个数据库都 ...

  7. mysql 主从,主主,主主复制时的主键冲突解决

    原理:slave 的i/o thread ,不断的去master抓取 bin_log, 写入到本地relay_log 然后sql thread不断的更新slave的数据 把主服务器所有的数据复制给从服 ...

  8. Symbol Table(符号表)

    一.定义 符号表是一种存储键值对的数据结构并且支持两种操作:将新的键值对插入符号表中(insert):根据给定的键值查找对应的值(search). 二.API 1.无序符号表 几个设计决策: A.泛型 ...

  9. python第五篇:Linux上将txt导入mysql

    昨天写小项目的时候遇到了一个需求:把txt文档的数据导入到mysql数据库中,开始本来想直接用Mysql Workbench导入TXT文件,但是最后发现不支持TXT导入,结果我吧嗒吧嗒的去把TXT转了 ...

  10. C# 往excel出力数据

    /// <summary> /// 出力Excel /// </summary> /// <param name="storeModelForExcel&quo ...