Fragment知识点总结


Fragment认识

Android自3.0版本之后引入了Fragment,Fragment是一种可以嵌入在Activity当中的UI片段,其实就是将大屏分成几个组,然后进行模块化管理。

Fragment的简单用法

首先编写两个布局文件,左边新建一个Fragment

右边新建一个right_gragment.xml文件

然后建立一个LeftFragment类,加载left_fragment布局 ,继承Fragment

同时建立一个RightFragment类,加载right_framgmen布局

最后在ativity_main.xml中引入两个fragment

动态添加Fragment

上面是在布局中添加Fragment的方法,不过Fragment真正强大之处在于,可以在程序运行时动态的添加到Activity中
我们来使用代码验证:创建一个another_right_fragmebt.xml,代码文件如下,与right_fragment一样,就是把背景色修改了一下

同样有一个新的fragment布局文件,就有新对应的类

我们需要修改一个activity_main.xml文件了,由于我们是动态添加,所以我们不能将布局写在activity_main.xml里面了。也就是说不能写死了

修改MainActivity中的代码:

在Fragment中实现返回栈

我们需要实现类似返回栈的效果,按back键可以返回上一个Fragment

在事物提交之前调用了Fragment的addToBack方法,它可以接收一个名字用于描述返回栈中的状态,一般传入null即可。

Fragment和Activity之间交互

Fragment和Activity其实各自存在于一个独立的类中,他们之间没有直接方式进行交互,
FragmentMangre提供了一个findFragmentById用于从布局文件中获取Fragment实例
val fragment = supportFragmentManager.findFragmentById(R.id.rightLayout) as LeftFragment

由于kotlin-android-extensions插件也对findFragmentById方法进行了扩展,所以我们可以写成
val fragment = leftFrag as Leftagment

Activity中调用Fragment的方式
if(activity != null) { val mainAcitivty = activity as MainActivity }

Fragment生命周期

Fragment与Activity类似

Fragment的状态和回调

1.运行状态
当一个Fragment所关联的所有Activity正处于运行状态时,该Fragment也处于运行状态
2.暂停状态
当一个Activity进入暂停状态时,与它相关联的Fragment就会进入停止状态
3.停止状态
当Activity进入停止状态,相关联的Fragment处于停止状态,通过调用FragmenTransaction的remove(),replace(),方法将Fragment从Activity移除,并且在事物提交之前调用了addToBackStack()方法,这时的Fragment也会进入停止状态
进入停止状态的Fragment对用户来说是不可见的
4.销毁状态
Activity销毁,与他相关的Fragment也就会进入销毁状态。
或者通过调用FragmentTransaction的remove(),repalce()方法将Fragment从Activity移除,但是事物提交之前并没有调用addToBackStack()方法,这时的Fragment也会进入销毁状态
我们看一下Fragment回调方法:
onAttach():当Fragment和Activity建立关联时调用
onCreateView():为Fragment创建视图(加载布局)的时候调用
onActivityCreated():确保与fragment相关联的Activity已经创建完毕时调用
onDestoryView():当与Fragment关联的视图被移除的时调用
onDetach():当fragment和Activity解除关联时调用

体验Fragment的生命周期

通过代码来感受Fragment的生命周期:

日志打印:

动态加载布局的技巧

我们可以根据设备分辨率或屏幕大小,在运行的时候决定加载哪个布局

使用限定符

我们应该有一个常识,平板很多都是双页模式,手机是单页模式。我们怎么能判断需要使用单页模式还是双页模式
我们需要使用限定度来实现(qualifier),我们修改FragmentTest项目中的activity_main.xml
代码如下:
我们首先编写activit_mian.xml文件为如下代码:显示单页模式

然后在res文件下创建layout-large文件,在创建一个activit_main.xml文件
然后编写里面的代码:显示双页模式

然后项目运行起来之后,larger是一个限定符号,屏幕被认为是large的设备就会自动加载,layout-large文件夹下的的布局,否则加载layout文件下的布局。
下面是常见的限定符:

使用最小宽度限定符

就是指定具体的值,在res下创建一个文件夹为layout-sw600dp,里面新建activity_main.xml文件,

当程序运行的屏幕宽度大于600dp的设备上时,会加载layout-sw600dp/activity_main布局,当运行设备的屏幕小于600dp的时候,仍然加载layout/activity_main布局