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布局