Android的Fragment

安卓重要UI组件之 Fragment 阅读详情

Fragment的生命周期 #

不废话,直接上图
这里写图片描述
fragment所在的 Activity 的生命周期会影响fragment的生命周期,其表现为,Activity 的每次生命周期回调都会引发每个片段的类似回调。 例如,当 Activity 收到 onPause() 时,Activity 中的每个片段也会收到 onPause()。

不过,fragment还有几个额外的生命周期回调,用于处理与 Activity 的唯一交互,以执行构建和销毁fragmentUI 等操作。这些额外的回调方法是:
onAttach()
在fragment已与 Activity 关联时调用(Activity 传递到此方法内)。
onCreateView()
调用它可创建与fragment关联的视图层次结构。
onActivityCreated()
在 Activity 的 onCreate() 方法已返回时调用。
onDestroyView()
在删除与fragment关联的视图层次结构时调用。
onDetach()
在取消fragment与 Activity 的关联时调用。

上图示说明了fragment受其宿主 Activity 影响的生命周期流。在该图中,可以看到 Activity 的每个连续状态如何决定fragment可以收到的回调方法。 例如,当 Activity 收到其 onCreate() 回调时,Activity 中的fragment只会收到 onActivityCreated() 回调。

一旦 Activity 达到恢复状态(onResume),您就可以向Activity 添加片段和删除其中的片段。 因此,只有当 Activity 处于恢复状态时,片段的生命周期才能独立变化。不过,当 Activity 离开恢复状态时,片段会在 Activity 的推动下再次经历其生命周期。

FragemntManager和FragmentTrasaction

  1. FragmentManager:
    FragmentManager能够实现管理activity中fragment. 通过调用activity的getFragmentManager()取得它的实例.
    FragmentManager可以做如下一些事情:
    1、使用findFragmentById() (用于在activity layout中提供一个UI的fragment)或findFragmentByTag()
    (适用于有或没有UI的fragment)获取activity中存在的fragment
    2、将fragment从后台堆栈中弹出, 使用 popBackStack() (模拟用户按下BACK 命令).
    3、使用addOnBackStackChangeListener()注册一个监听后台堆栈变化的listener.

  2. FragmentTransaction:
    在activity的onResume中,FragmentTransaction对fragment进行添加,移除,替换,以及执行其他动作。

从 FragmentManager 获得一个FragmentTransaction的实例 :
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

每一个事务都是同时要执行的一套变化.可以在一个给定的事务中设置你想执行的所有变化,使用诸如 add(), remove(), 和 replace().然后, 要给activity应用事务, 必须调用 commit().

在调用commit()之前, 你可能想调用 addToBackStack(),将事务添加到一个fragment事务的back stack. 这个back stack由activity管理, 并允许用户通过按下 BACK 按键返回到前一个fragment状态.

举个例子, 这里是如何将一个fragment替换为另一个, 并在后台堆栈中保留之前的状态:

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();

在这个例子中, newFragment 替换了当前layout容器中的由R.id.fragment_container标识的fragment.通过调用 addToBackStack(), replace事务被保存到back stack, 因此用户可以回退事务,并通过按下BACK按键带回前一个fragment.

如果添加多个变化到事务(例如add()或remove())并调用addToBackStack(), 然后在你调用commit()之前的所有应用的变化会被作为一个单个事务添加到后台堆栈, BACK按键会将它们一起回退.

添加变化到 FragmentTransaction必须调用 commit().如果添加多个fragment到同一个容器, 那么添加的顺序决定了它们在view hierarchy中显示的顺序.当执行一个移除fragment的事务时, 如果没有调用 addToBackStack(), 那么当事务提交后, 那个fragment会被销毁,并且用户不能导航回到它. 有鉴于此, 当移除一个fragment时,如果调用了 addToBackStack(), 那么fragment会被停止, 如果用户导航回来,它将会被恢复.

注意

  1. 用接口的方式实现activity与fargment的通信
  2. 你只能在activity保存它的状态(当用户离开activity)之前使用commit()提交事务.如果你试图在那个点之后提交, 会抛出一个异常.这是因为如果activity需要被恢复, 提交之后的状态可能会丢失.对于你觉得可以丢失提交的状况, 使commitAllowingStateLoss().也就是说如果commit在onSavedInstanceState()之后调用,会发生状态丢失,这个时候需要调用commitAllowingStateLoss()

                             Honeycomb之前的版本    Honeycomb及更新的版本
    onSaveInstanceState(Bundle)会在哪些方法调用前被执行   onPause()          onStop()
    commit()在onPause()前被调用                OK           OK
    commit()在onPause()和onStop()执行中间被调用      STATE LOSS         OK
    commit()在onStop()之后被调用             EXCEPTION        EXCEPTION

  3. 如需 Fragment 内的某个 Context 对象,可以调用 getActivity(),在使用之前要判断它是否null。(类似加载bitmap需要捕获oom异常)

  4. fragment.getActivity()的异常情况:
    fragment为空,空指针异常——fragment被销毁;
    获得的activity为空 ,空指针异常:
    生命周期还没附着或者分离;
    activity被回收,但fragment的状态却保存了下来:
    如果系统内存不足、切换横竖屏、app长时间在后台运行,Activity都可能会被系统回收然后重建,但Fragment并不会随着Activity的回收而被回收,创建的所有Fragment会被保存到Bundle里面,从而导致Fragment丢失对应的Activity。

示例和解决办法:假设我们的页面叫MyActivity(继承自FragmentActivity),其中用到的Fragment叫MyFragment。

出现上面这种情况时,app发生的变化如下:
1、在前面提到的几种情况下系统回收了MyActivity
2、通过onSaveInstanceState保存MyFragment的状态
3、用户再次点击进入app
4、由于MyActivity被回收,系统会重启MyActivity,根据之前保存的MyFragment的状态恢复fragment
5、MyActivity的代码逻辑中,会再次创建新的MyFragment
6、页面出现混乱,覆盖了两层的fragment。假如恢复的MyFragment使用到了getActivity()方法,会报空指针异常

对于上面的问题,可以考虑下面这两种解决办法:

1、不保存fragment的状态:在MyActivity中重写onSaveInstanceState方法,将super.onSaveInstanceState(outState);注释掉,让其不再保存Fragment的状态,达到fragment随MyActivity一起销毁的目的。

2、重建时清除已经保存的fragment的状态:在恢复Fragment之前把Bundle里面的fragment状态数据给清除。方法如下:

    if(savedInstanceState!= null)

        {
            String FRAGMENTS_TAG = "Android:support:fragments";
            savedInstanceState.remove(FRAGMENTS_TAG);

        }
安卓的fragment跳转问题 最近在做安卓项目,然后就遇到了fragment的问题。 之前做项目的代码拿出来看,发现和这一次的做法不太一样,但在编码过程中就出现了一些跳转的问题。 之前实现fragment是利用FragmentActivity和PageView实现的,这一次就直接继承Fragment,其实思路还是一样的。 实现fragment的方法很多,下面是我这次项目采用的方法: 首先在一个Activity中添加几个 阅读详情

相关推荐

如何用Deep OC-SORT提升多目标跟踪精度?实战配置与性能优化指南

本文是一份针对开发者的Deep OC-SORT多目标跟踪实战指南。详细解析了如何通过部署其核心的“动态外观记忆”与“相机防抖”模块来有效应对遮挡与抖动,从而显著提升跟踪精度与连续性。内容涵盖从环境搭建、参数调优到性能压榨的全流程,并提供针对不同场景的配置建议与工程落地技巧。

f9g0h的博客 670

Fragment重叠问题解决

public void onCreate(Bundle savedInstanceState) { if (savedInstanceState != null) { // FRAGMENTS_TAG savedInstanceState.remove("android:support:fragments"); ...

阿三的小九九 370

TCNOpen实现TRDP通信协议(源码编译运行测试)

概述 本文介绍了通过TCNOpen开源源码实现TRDP通信,包括源码下载,开发环境搭建,编译运行,测试。 Linux环境下编译运行TRDP (一) 下载CANOpen源码。 下载地址:https://sourceforge.net/p/tcnopen/trdp/HEAD/tree/ (二) 源码编译 下载源码解压过后,在根目录文件readme-makefile.txt有介绍源码的配置和编译方法。 在trdp/config目录下可以看到包含在linux环境下的编译配置文件LINUX_config;执行”m

fengweibo112的博客 9630

(原创)解决APP进程被杀死出现的一些坑

这几天在开发中遇到了这样一个问题 当打开的App数量达到一定数目时 原先的App进程会被系统杀死 然后再次进入这个被杀死的App时 发现了一些异常 经过排查,是viewpager的getitem方法没有被调用 通过网上的一些信息得知 用安卓默认的恢复方式来恢复这些数据 是会存在一些问题的 比如fragment的getActivity返回的值为空 于是我想到 是否可以不执行重新加载的方式呢? 于是就...

Android_xiong_st的博客 6975

STM32H7+LAN8720A之ETH与LWIP配置问题(End)

开篇介绍 由于项目中需要使用到STM32H7系列的芯片,且该系列无法移植ST的标准库,只能使用ST的HAL库,通过STM32Cube生成HAL库的基本代码。在项目开发中需要使用到STM32板载的ETH口,在简化的四层模型中充当着数据链路层的角色,我们只需添加PHY并配置好IP,即可实现基本的TCP主从机通信、UDP通信等等。 一、激光雷达3i-T1 由于使用了一款只具有网口通信的单线激光雷达,其具有TCP和UDP方式的通信方式,为了避免进行TCP中的socket报文解析和繁琐的通信握手过程,我们首先将雷达配

weixin_42024702的博客 1万+

线上专利申请(超详细)| 签名确认

在【法人登录】页面点击【证书登录】按钮,弹出证书登录提示框,点击【确 认】按钮,进入到输入证书密码页面,点击【取消】按钮,取消本次操作。企业在提交申请时,需要增加签名,如使用企业账户点击提交,会弹出“法人、代理机构不能签名,请使用经办人签名”,这个时候就需要换个账号了。在需要签名时,将专利官网的登录方式点击法人登录,选择扫码登录,使用移动端经办人账户的扫一扫功能扫描登录。登录完成后,再点击签名,使用移动端扫一扫功能,扫描签名,输入证书号,确认签名,并提交。最后,祝大家的申请都成功!

weixin_62112323的博客 9109

Android 异常重启--踩坑归来--干货篇

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。

star_nwe的博客 1209

使用 MATLAB/Simulink 对一个开关磁阻电机进行建模

*开关磁阻电机(Switched Reluctance Motor, SRM)**是一种新型的无刷电机,以其简单的机械结构、宽广的调速范围和较高的效率在工业应用中得到了广泛关注。SRM的独特之处在于其定子和转子均为凸极结构,并且通过改变绕组电流的方向来实现转矩的产生和控制。本教程将详细介绍如何使用对一个开关磁阻电机进行建模,并探讨其基本控制策略,特别是针对双凸极结构的SRM。本文介绍了如何使用构建一个开关磁阻电机的双凸极结构模型,并探讨了其基本控制策略。

amy_mhd的博客 203

Activity回收时候fragment的异常

在Android开发中,如果我们用到V4包里面的Fragment,在应用被切换到后台的时候,Activity可能被回收,但是创建的所有Fragment则会被保存到Bundle里面,下面是FragmentActivity的部分源码/**      * Save all appropriate fragment state.      */     @Override     protecte

先疯盗骨 2984

海外购物商城源码 带即时通讯IM源码

在海外购物商城中,即时通讯IM源码可以为用户提供更便捷、高效的沟通方式,帮助解决跨国交易中的语言和文化差异问题。总之,即时通讯IM源码在海外购物商城中扮演着重要的角色,可以为用户提供更方便、高效的沟通方式,解决跨国交易中的语言和文化差异问题。(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买)实时翻译:即时通讯IM源码提供实时翻译功能,能够快速准确地翻译不同语言之间的文字、语音、视频等信息,帮助用户克服语言障碍。

很酷的站长的博客 259

汇川Easy系列PLC系统PID指令编程应用(增量型)

增量式PIDS7-1200/1500增量式PID(输出归一化、支持PWM输出)_西门子1200pid算法公式-优快云博客文章浏览阅读1k次。本文介绍了S7-1200/1500 PLC中增量式PID算法的应用,包括输出归一化和PWM输出。通过详细解析,阐述了PID输出如何限制在0.0-1.0之间,并且如何将PID输出与PWM占空比关联,适用于温度等控制场景。

RXXW_Dor的博客 1422

终极解决方案:App被系统回收之后,再次打开Fragment产生覆盖的问题。附带原理解析。

fragment为什么会在activity被回收的时候保存呢? 保存到哪里了呢? 怎么恢复的呢? 如何解决?

Pumpkin's Blog 4255

C3 模块与普通 Bottleneck 堆叠区别

维度普通 Bottleneck 堆叠C3 模块设计理念残差学习CSP + 特征分治信息路径单一路径双路径(主干 + bypass)融合方式相加(Add)拼接(Concat)+ 卷积计算效率较低高(通道减半)特征保留弱(多次非线性)强(直连保留原始信息)梯度传播单一主路径多样化、更稳定任务适配通用(分类为主)专为目标检测优化可扩展性有限极强(即插即用各种模块)实际性能基准线显著优于(尤其在小目标和效率方面)

浩瀚之水的专栏 107

【Fragment】安卓Android开发中的Activity、Fragment、Adapter

前面介绍了Activity,简单地说Activity代表着应用程序中的一个单独的屏幕或界面,用户可以与之交互。那么现在就再来了解一下Fragment。在安卓开发中,Fragment是一种可以嵌入到Activity中的可重用组件,用于构建灵活和模块化的用户界面。与Activity类似,Fragment具有自己的布局和生命周期,并且可以包含用户界面元素和逻辑。

weixin_67898144的博客 1528

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

android fragment详解,安卓Fragment使用详解

Fragment是在安卓3.0版本中添加的,主要是为了解决安卓设备尺寸多样化后界面的显示问题。Fragment比Activity较轻量级,也可以提供与用户交互的界面并且有自己的生命周期,也不用在Manifest.xml中注册但它必须嵌套在Activity中使用。之前需要使用多个Activity显示的内容,现在可以用一个Activity嵌套多个Fragment来实现。下面就来说说Fragment的知...

weixin_36379084的博客 1615

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Android上下fragment,安卓Fragment(上)

一、Fragment理解(是什么) 《1》Fragment之与我理解,就是一枚小Activity,他依赖于Activity而存在,一个Activity中可以包括一个或多个Fragment是Activity的片段。Fragment的生命周期依赖于Activity的生命周期。 二、Fragment的实战(怎么用) 《1》Fragment的生成。 Fragment竟然是Activity的片段,“麻雀虽小...

weixin_30253771的博客 226

【Activity】安卓Android开发中的Activity、Fragment、Adapter

我最近刚刚接触Android开发,对这个方面的开发可以说是一无所知,所以想着尝试开始理解。在这段时间的摸爬滚打里面,我发现了其中Activity、Fragment、Adapter三种非常常用,所以在这里进行一下我自己的理解。

weixin_67898144的博客 2792

安卓Android开发,左边listView右边Fragment切换页面

安卓Android开发,左边listView右边Fragment切换页面

m0_63222566的博客 2262

安卓开发fragment报错_android开发 Fragment嵌套调用常见错误

在activity中有时须要嵌套调用fragment,但嵌套调用往往带来视图的显示与预期的不一样或是fragment的切换有问题。在使用时要注意几点:1、fragment中嵌套fragment,子fragment视图无法显示:例如以下:父fragment的.xml文件:android:layout_width="match_parent"android:layout_height="match_p...

weixin_33814002的博客 706

Android安卓Fragment简单实现

Android安卓Fragment简单实现

Alex_Melody的博客 1680

安卓 Fragment进阶

安卓 专高 day05 Fragment进阶fragment传值activity向fragment传值fragment向activity传值fragment向fragment传值 fragment传值 activity向fragment传值 fragment的xml文件 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xml...

zxsenqiu的博客 221

android fragment 底部菜单栏,安卓开发-底部导航栏切换Fragment进行显示

内容纲要底部导航栏切换Fragment进行显示创建Fragment对象通常会有多个Fragment用于切换用Fragment[] fragments保存为集合private FrameLayout frame_home;private Fragment[] fragments;private HomeFragment homeFragment;private int lastfragment = ...

weixin_29053695的博客 555

安卓编写继承fragment的java_Android:Fragment最全面介绍 & 使用方法解析

前言Fragment在 Android开发中非常常用今天,我将讲解关于Fragment的使用目录Fragment介绍&使用方法解析.png1. 定义Activity界面中的一部分,可理解为模块化的ActivityFragment不能独立存在,必须嵌入到Activity中Fragment具有自己的生命周期,接收它自己的事件,并可以在Activity运行时被添加或删除Fragment的生命周期...

weixin_36397372的博客 997

安卓Fragment入门

安卓Fragmen 主布局资源文件–activity.xml 主布局现在没有负责具体的界面设计工作,它只是提供一个容器或平台,让碎片去负责各自的界面设计。 5、 创建碎片 (1)创建第一个碎片 -基于模板创建碎片 FirstFragment - 设置碎片名称FirstFragment - 单击【finish】按钮 - 修改第一个碎片的布局资源文件-fragment_first.xml (2)创建第二个碎片 基于模板创建碎片SecondFragment 单击【finish】按钮 修改第二个碎

IKZWJ0516的博客 747
上一篇: Android的activity启动延迟加载
下一篇: Android存储数据的几种方式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值