【转】 Pro Android学习笔记(四一):Fragment(6):数据保留
在横屏竖屏切换时,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重新创建,在若干生命周期状态中都可以读取,例如:
- public void onInflate(Activity activity, AttributeSet attrs,Bundle savedInstanceState) {
- if(savedInstanceState != null){
- showInfo("**** book is " + savedInstanceState.getString("Book"));
- }
- ... 略 ...
- super.onInflate(activity, attrs, savedInstanceState);
- }
- public void onCreate(Bundle bundle) {
- super.onCreate(bundle);
- if(bundle != null){
- showInfo("**** book is " + bundle.getString("Book"));
- }
- }
保留fragment实例
在fragment的生命周期图中,有虚线的部分,从onDestroyView回到onCreateView状态,这是保留fragment实例,但测试场景,我没能找到进行验证。下面是保留fragment实例的实现方式:
- public void onCreate(Bundle bundle) {
- super.onCreate(bundle);
- setRetainInstance(true);//设置true,表明在存储中保留fragment对象。
- }
由于将返回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):数据保留的更多相关文章
- 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果
目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...
- 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版
目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...
- 【转】 Pro Android学习笔记(五六):配置变化
目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...
- Pro Android学习笔记 ActionBar(1):Home图标区
Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...
- 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET
目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...
- 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode
目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...
- 【转】 Pro Android学习笔记(五二):ActionBar(5):list模式
可以在action bar中加入spinner的下来菜单,有关spinner,可以参考Pro Android学习笔记(二十):用户界面和控制(8):GridView和Spinner. list的样式和 ...
- 【转】 Pro Android学习笔记(三五):Menu(6):XML方式 & PopUp菜单
目录(?)[-] 利用XML创建菜单 XML的有关属性 onClick事件 Pop-up菜单 利用XML创建菜单 在代码中对每个菜单项进行设置,繁琐且修改不灵活,不能适配多国语言的要求,可以利用资源进 ...
- 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单
目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...
随机推荐
- 【python】-- 类的装饰器方法、特殊成员方法
装饰器方法 类的另外的特性,装饰器方法:静态方法(staticmethod).类方法(classmethod).属性方法(property) 一.静态方法 在方法名前加上@staticmethod装饰 ...
- 【译】常见 Java 异常解释(恶搞版)
常见 Java 异常解释:(译者注:非技术角度分析.阅读有风险,理解需谨慎o(╯□╰)o) java.lang ArithmeticException 你正在试图使用电脑解决一个自己解决不了的数学问题 ...
- 洛谷2704 [NOI2001]炮兵阵地
题目戳这里 Solution 状压DP很好的入门题,用熟练位运算貌似也没那么难. 首先分析一下题目: 看见n=100,m=10,立马就想到了状压,看起来也像DP,所以我们还是采用行号为阶段的状压DP. ...
- PAT 1057. 数零壹(20)
给定一串长度不超过105的字符串,本题要求你将其中所有英文字母的序号(字母a-z对应序号1-26,不分大小写)相加,得到整数N,然后再分析一下N的二进制表示中有多少0.多少1.例如给定字符串“PAT ...
- FPGA低温不能启动分析
FPGA低温不能启动分析 现象描写叙述:在给medium板光端机做低温试验时,分别给发送版.接收板断电又一次启动,发现有的板子在-40°能够启动,而有些板子在-20°都不能启动.须要升高温度到0°以上 ...
- bd存储
var sessionData = new Array();var setSessionData=function(key,val){ if(sessionStorage){ sessionStora ...
- client = new DatagramSocket(LocalPort) 是说端口已经被占用的意思
ok 现在遇到一个问题,client = new DatagramSocket(LocalPort) 是说端口已经被占用的意思 ref:!!https://community.oracle.com/t ...
- 2个canvas叠加运用(时钟例子)
最近在学习canvas,http://corehtml5canvas.com/code-live/,主要的学习方式就是通过上面的一些例子来学习canvas的一些用法.但是我发现,这里的例子,只要can ...
- nodejs模块之fs&&stream
nodejs的文件系统fs模块,可以实现对文件.目录等的操作,stream模块实现对文件数据的断续读写操作 一.文件操作 fs.readFile(file[,options],callback) 异步 ...
- CSS3环形动画菜单
在线演示 本地下载