探究Fragment

Fragment

注意使用AndroidX库中的Fragment,系统内置的已经废除。

补充:layout_gravity和gravity的区别:gravity作用内容为组件内部的,layout_gravity作用于自身相对于父容器的位置。

使用

简单使用

fragment标签中需要使用tools:layout来设置属性预览,否则无法出现预览画面。

动态添加

主要分为五步:

  1. 创建待添加Fragment的实例;
  2. 取FragmentManager,在Activity中可以直接调用getSupportFragmentManager()方法获取;
  3. 开启一个事务,通过调用beginTransaction()方法开启;
  4. 向容器内添加或替换Fragment,一般使用replace()方法实现,需要传入容器的id和待添加的Fragment实例;
  5. 提交事务,调用commit()方法来完成。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MainActivity : AppCompatActivity() { 

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
button.setOnClickListener {
replaceFragment(AnotherRightFragment())
}
replaceFragment(RightFragment())
}

private fun replaceFragment(fragment: Fragment) {
val fragmentManager = supportFragmentManager
val transaction = fragmentManager.beginTransaction()
transaction.replace(R.id.rightLayout, fragment)
transaction.commit()
}

}

上述代码直接获取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
2
3
if (activity != null) { 
val mainActivity = activity as MainActivity
}

不同的Fragment之间进行通信,首先在一个Fragment中 可以得到与它相关联的Activity,然后再通过这个Activity去获取另外一个Fragment的实例, 这样就实现了不同Fragment之间的通信功能

生命周期

QQ_1737118026269

看懂图熟悉即可。

在Fragment中你也可以通过onSaveInstanceState()方法来保存数据,因为进入停止状态的Fragment有可能在系统内存不足的时候被回收。保存下来的数据在onCreate()、onCreateView()和onActivityCreated()这3个方法中你都可以重新得到,它们都含有一个Bundle类型的savedInstanceState参数。

动态加载布局

限定符

限定符是根据文件夹的名字,根据设备情况,来选择读取文件夹的一种方式。

QQ_1737118464517

最小宽度限定符

最小宽度限定符允许我们对屏幕的宽度指定一个最小值(以dp为单位),然后以这个最小值为临界点,屏幕宽度大于这个值的设备就加载一个布局,屏幕宽度小于这个值的设备就加载另一个布局。如layout-sw600dp这就意味着,当程序运行在屏幕宽度大于等于600 dp的设备上时,会加载layout-sw600dp中的布局。


Kotlin课堂

拓展函数

扩展函数表示即使在不修改某个类的源码的情况下,仍然可以打开这个类,向该类添加新的函数。

1
2
3
fun ClassName.methodName(param1: Int, param2: Int): Int { 
return 0
}

定义扩展函数只需要在函数名的前面加上一个ClassName.的语法结构,就表示将该函数添加到指定类当中了。

QQ20250112-220451

向哪个类中添加扩展函数,就定义一个同名的Kotlin文件,这样便于你以后查找。最好将它定义成顶层方法,这样可以让扩展函数拥有全局的访问域。

运算重载符

运算符重载使用的是operator关键字,只要在指定函数的前面加上operator关键字,就可以实现运算符重载的功能了。

指定函数常见如下:

QQ_1737118967572

Kotlin允许我们对同一个运算符进行多重重载。