Android基础——Fragment的使用
该文章为郭霖所著《第一行代码》第三版中第五章部分内容的高度概括
Fragment和Activity的关系
-
Fragment不能独立存在,必须嵌入到Activity中
-
一个Activity可以运行多个Fragment
-
Activity是屏幕的主题,而Fragment是Activity的一个组成元素
-
Fragment有自己的生命周期,接收它自己的事件,并可以在Activity运行时被添加或删除
-
Fragment的生命周期受Activity生命周期的影响
Fragment的使用
-
创建两个及以上布局
-
创建一个类继承Fragment类,重写onCreateView方法,该方法传入三个参数,一个是布局填充器LayoutInflater的实例,一个是父元素对象,一个是传递数据的容器Bundle。
-
onCreateView返回由布局填充器填充的view实例
-
在父布局xml文件中创建fragment,指定其name为对应的Fragment类
动态添加Fragment
-
创建待添加的fragment实例。
-
获取FragmentManager,在Activity中可以直接调用getSupportFragmentManager()方法获取。
-
开启一个事物,通过调用beginTransaction()方法开启。
-
向容器内添加或替换Fragment,一般使用replace()方法来实现,需要传入容器的id和待添加的Fragment实例。
-
提交事务,调用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的状态和回调
- 运行状态
当一个Fragment所关联的Activity正处于运行状态时,该Fragment也处于运行状态 - 暂停状态
当一个Activity进入暂停状态时(由于另一个未占满屏幕的activity被添加到了栈顶,与它相关联的Fragment就会进入暂停状态。 - 停止状态
当一个Activity进入停止状态时,与它相关联的Fragment就会进入停止状态,或者通过调用FragmentTransaction的remove()、replace()方法将Fragment从Activity中移除,但在事务提交之前调用了addToBackStack方法,这时的Fragment也会进入停止状态。总的来说,进入停止状态Fragment对用户来说是完全不可见的,有可能会被系统回收。 - 销毁状态
Fragment纵使依附于Activity而存在,因此当Activity被销毁时,与它相关联的Fragment 就会进入销毁状态。或者通过调用FragmentTransaction的remove()、replace()方法将Fragment从Activity中移除,但在事务提交之前并没有调用addToBackStack()方法,这时的Fragment也会进入销毁状态。
onAttach() // 当Fragment和Activity建立关联时调用。
onCreateView() // 为Fragment创建视图(加载布局 )的时候调用。
onActivityCreated() // 确保与Fragment相关联的Activity已经创建完毕时调用。
onDestroyView() // 当与Fragment关联的视图被移除时调用。
onDetach() // 当Fragment和Activity解除关联时被调用。
本文来自博客园,作者:maplerain,转载请注明原文链接:https://www.cnblogs.com/maplerain/p/16255585.html 博主B站