ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android基础——Fragment的使用

2022-05-10 22:00:08  阅读:177  来源: 互联网

标签:状态 调用 Fragment 基础 实例 Activity Android 方法


该文章为郭霖所著《第一行代码》第三版中第五章部分内容的高度概括

Fragment和Activity的关系

  • Fragment不能独立存在,必须嵌入到Activity中

  • 一个Activity可以运行多个Fragment

  • Activity是屏幕的主题,而Fragment是Activity的一个组成元素

  • Fragment有自己的生命周期,接收它自己的事件,并可以在Activity运行时被添加或删除

  • Fragment的生命周期受Activity生命周期的影响

Fragment的使用

  1. 创建两个及以上布局

  2. 创建一个类继承Fragment类,重写onCreateView方法,该方法传入三个参数,一个是布局填充器LayoutInflater的实例,一个是父元素对象,一个是传递数据的容器Bundle。

  3. onCreateView返回由布局填充器填充的view实例

  4. 在父布局xml文件中创建fragment,指定其name为对应的Fragment类

动态添加Fragment

  1. 创建待添加的fragment实例。

  2. 获取FragmentManager,在Activity中可以直接调用getSupportFragmentManager()方法获取。

  3. 开启一个事物,通过调用beginTransaction()方法开启。

  4. 向容器内添加或替换Fragment,一般使用replace()方法来实现,需要传入容器的id和待添加的Fragment实例。

  5. 提交事务,调用commit()方法来完成

在Fragment中实现返回栈

  动态添加一个Fragment后,这时候按下back会退出,如果想实现类似返回栈的效果,按下back键返回上一个Activity,该怎么办?
Fragment中提供了一个addToBackStack()方法,可以将一个事务添加到栈

  Fragment和Activity之间的交互
  虽然Fragment是嵌入在Activity中显示的,但实际上Fragment和Activity是各自存在于一个独立的类当中。如果想要在Activity中调用Fragment里的方法,或者在Fragment中调用Activity里的方法,该如何实现?

  为了方便Fragment和Activity之间进行交互,FragmentManager提供了一个类似于findViewById的方法。专门从布局文件里获取Fragment实例。代码如下

val fragment = supportFragmentManager.findFragmentById(R.id.leftFrag) as LeftFragment

  调用FragmentManager的findFragmentById()方法,可以在Activity中得到相应的Fragment的实例,然后就能够轻松地调用Fragment中的方法了。
  另外还有一种写法,是kotlin-android-extensions插件对findFragmentById的拓展,允许我们直接使用布局文件中定义的Fragment id名称来自动获取相应的Fragment实例,代码如下

val fragment = leftFrag as LeftFragment

  掌握了Activity中调用Fragment方法,那么在Fragment中又该如何调用Activity中的方法呢?其实在每个Fragment中都可以通过getActivity来获取到和当前Fragment相关联的Activity实例,代码如下

if(activity != null){
    val mainActivity = activity as MainActivity 
}

这里由于getActivity方法有可能返回null,所以需要先进行一次判空处理。

  关于不同的Fragment之间进行通信,其实看上去并没有那么复杂,首先先获取Activity实例,再通过这个实例调用获取Fragment实例的方法获取实例就行了。

Fragment生命周期

一、Fragment的状态和回调

  1. 运行状态
      当一个Fragment所关联的Activity正处于运行状态时,该Fragment也处于运行状态
  2. 暂停状态
      当一个Activity进入暂停状态时(由于另一个未占满屏幕的activity被添加到了栈顶,与它相关联的Fragment就会进入暂停状态。
  3. 停止状态
      当一个Activity进入停止状态时,与它相关联的Fragment就会进入停止状态,或者通过调用FragmentTransaction的remove()、replace()方法将Fragment从Activity中移除,但在事务提交之前调用了addToBackStack方法,这时的Fragment也会进入停止状态。总的来说,进入停止状态Fragment对用户来说是完全不可见的,有可能会被系统回收。
  4. 销毁状态
      Fragment纵使依附于Activity而存在,因此当Activity被销毁时,与它相关联的Fragment 就会进入销毁状态。或者通过调用FragmentTransaction的remove()、replace()方法将Fragment从Activity中移除,但在事务提交之前并没有调用addToBackStack()方法,这时的Fragment也会进入销毁状态。
onAttach()     		 // 当Fragment和Activity建立关联时调用。
onCreateView()		 // 为Fragment创建视图(加载布局 )的时候调用。
onActivityCreated()      // 确保与Fragment相关联的Activity已经创建完毕时调用。
onDestroyView() 	 // 当与Fragment关联的视图被移除时调用。
onDetach() 		 // 当Fragment和Activity解除关联时被调用。

标签:状态,调用,Fragment,基础,实例,Activity,Android,方法
来源: https://www.cnblogs.com/maplerain/p/16255585.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有