Android基础——Fragment的使用

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

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解除关联时被调用。
posted @ 2022-05-10 21:54  maplerain  阅读(540)  评论(5编辑  收藏  举报