Fragment
注意使用AndroidX库中的Fragment,系统内置的已经废除。
补充:layout_gravity和gravity的区别:gravity作用内容为组件内部的,layout_gravity作用于自身相对于父容器的位置。
使用
简单使用
fragment标签中需要使用tools:layout来设置属性预览,否则无法出现预览画面。
动态添加
主要分为五步:
- 创建待添加Fragment的实例;
- 取FragmentManager,在Activity中可以直接调用getSupportFragmentManager()方法获取;
- 开启一个事务,通过调用beginTransaction()方法开启;
- 向容器内添加或替换Fragment,一般使用replace()方法实现,需要传入容器的id和待添加的Fragment实例;
- 提交事务,调用commit()方法来完成。
1 | class MainActivity : AppCompatActivity() { |
上述代码直接获取fragmentManager方式已经废弃,问题转变为在activity中获取fragment的实例。
返回栈
解决按下Back键程序就会直接退出的问题,可以使用addToBackStack()方法。
和Activity的交互
Fragment和Activity是各自存在于一个独立的类当中的,它们之间并没有那么明显的方式来直接进行交互。
如果想要在Activity中调用Fragment里的方法,FragmentManager提供了一个类似于 findViewById()的方法,专门用于从布局文件中获取Fragment的实例。
1 | val fragment = supportFragmentManager.findFragmentById(R.id.leftFrag) as LeftFragment |
在Fragment中调用 Activity,在每个Fragment中都可以通过调用getActivity()方法来得到 和当前Fragment相关联的Activity实例。
1 | if (activity != null) { |
不同的Fragment之间进行通信,首先在一个Fragment中 可以得到与它相关联的Activity,然后再通过这个Activity去获取另外一个Fragment的实例, 这样就实现了不同Fragment之间的通信功能
生命周期
看懂图熟悉即可。
在Fragment中你也可以通过onSaveInstanceState()方法来保存数据,因为进入停止状态的Fragment有可能在系统内存不足的时候被回收。保存下来的数据在onCreate()、onCreateView()和onActivityCreated()这3个方法中你都可以重新得到,它们都含有一个Bundle类型的savedInstanceState参数。
动态加载布局
限定符
限定符是根据文件夹的名字,根据设备情况,来选择读取文件夹的一种方式。
最小宽度限定符
最小宽度限定符允许我们对屏幕的宽度指定一个最小值(以dp为单位),然后以这个最小值为临界点,屏幕宽度大于这个值的设备就加载一个布局,屏幕宽度小于这个值的设备就加载另一个布局。如layout-sw600dp这就意味着,当程序运行在屏幕宽度大于等于600 dp的设备上时,会加载layout-sw600dp中的布局。
Kotlin课堂
拓展函数
扩展函数表示即使在不修改某个类的源码的情况下,仍然可以打开这个类,向该类添加新的函数。
1 | fun ClassName.methodName(param1: Int, param2: Int): Int { |
定义扩展函数只需要在函数名的前面加上一个ClassName.的语法结构,就表示将该函数添加到指定类当中了。
向哪个类中添加扩展函数,就定义一个同名的Kotlin文件,这样便于你以后查找。最好将它定义成顶层方法,这样可以让扩展函数拥有全局的访问域。
运算重载符
运算符重载使用的是operator关键字,只要在指定函数的前面加上operator关键字,就可以实现运算符重载的功能了。
指定函数常见如下:
Kotlin允许我们对同一个运算符进行多重重载。