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

2024-01-05 10:38

本文主要是介绍Pro Android学习笔记 四一 Fragment 6 数据保留,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

在横屏竖屏切换时,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开发相关文章

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述

这篇关于Pro Android学习笔记 四一 Fragment 6 数据保留的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/572589

相关文章

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

升级至三频BE12000! 华硕ROG魔盒Pro路由器首发拆解评测

《升级至三频BE12000!华硕ROG魔盒Pro路由器首发拆解评测》华硕前两天推出新一代电竞无线路由器——ROG魔盒Pro(StrixGR7Pro),该产品在无线规格、硬件配置及功能设计上实现全... 作为路由器行业的T1梯队厂商,华硕近期发布了新旗舰华硕ROG魔盒Pro,除了保留DIY属性以外,高达120

三频BE12000国补到手2549元! ROG 魔盒Pro WIFI7电竞AI路由器上架

《三频BE12000国补到手2549元!ROG魔盒ProWIFI7电竞AI路由器上架》近日,华硕带来了ROG魔盒ProWIFI7电竞AI路由器(ROGSTRIXGR7Pro),目前新... 华硕推出了ROG 魔盒Pro WIFI7电竞AI路由器(ROG STRIX GR7 Phttp://www.cppcn

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I