Android 使用Kotlin优雅的添加Fragment

综述

在上面文章聊一聊Kotlin扩展函数run,with,let,also和apply的使用和区别中讲解Kotlin的几个扩展函数的使用和区别。那么在这篇文章中去自己定义一些扩展函数来更加优雅的去将添加Fragment到Activity中。

回顾Fragment使用

在使用Kotlin之前,首先回顾一下在Java中是如何添加一个Fragment到Activity当中的。

FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(frameId, fragment);
transaction.commit();

上面这段代码是在熟悉不过了,在项目中为了避免大量的重复书写上面那段代码,通常会创建一个ActivityUtil的类,在这个类中写一个static方法来封装上面那段代码。

public static void addFragmentToActivity(FragmentManager manager, Fragment fragment, int frameId) {

    FragmentTransaction transaction = manager.beginTransaction();
    transaction.add(frameId, fragment);
    transaction.commit();

}

这时候在Activity当中便能够直接使用上面的方法:

ActivityUtil.addFragmentToActivity(
        getSupportFragmentManager(), fragment, R.id.frag_container);

在介绍完使用Java来添加Fragment后,下面就来看一下如何使用Kotlin更优雅的来添加Fragment。

Kotlin添加Fragment

使用Kotlin完成Fragment的天假只需要两步即可:

消除beginTransaction() and commit()方法

对于Fragment的操作每次都需要beginTransaction()和commit(),如果在开发中少写了一个commit()方法,或许会花费大量时间进行调试找到问题所在。所以省去beginTransaction()和commit()代码的书写还是很有必要的。

在Kotlin中,可以为FragmentManager类写一个扩展函数,将一个带有接收者函数的lambda作为扩展函数的参数。下面简单介绍一下相关知识点:

扩展函数(Extension functions) 
扩展函数能够向已经存在的类中添加新的函数或属性,也包含第三方库或者SDK中的类。在函数内部,可以不使用任何限定符来访问类的公共函数和属性,就像这个函数在类的内部一样。

高阶函数(Higher-Order Functions) 
高阶函数是将函数作为参数,或返回一个函数的函数。可以传递函数或者从函数中返回一个函数。

带接收者的Lambda函数(Function Literals with Receiver) 
可以说是以上两个的组合,一个高阶函数将一个扩展函数作为它的参数。将lambda表达式中作为参数传递,并且我们可以访问接收者的函数和属性,就好像lambda函数在接收者对象的内部一样。

现在书写一个FragmentManager的扩展函数,它将一个带有接受者的Lambda函数作为传入的参数,而这个FragmentTransaction就是接收者对象。

inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> Unit) {
    val fragmentTransaction = beginTransaction()
    fragmentTransaction.func()
    fragmentTransaction.commit()
}

上面这段代码是一个扩展函数,他接收的参数是一个带有接收者的Lambda函数。这个Lambda函数没有任何参数并且返回的是Unit。在这个inTransaction扩展函数体内首先调用beginTransaction()获取FragmentTransaction对象,然后在执行Lambda函数之后执行commit()方法。

那么就可以通过一下代码将我们的Fragment添加到Activity当中:

supportFragmentManager.inTransaction {
    add(R.id.frameLayoutContent, fragment)
}

在这里可以看出来在Lambda函数当中可以直接操作FragmentTransaction中的方法,并且没有任何的使用限制。因为这个Lambda函数本身就是FragmentTransaction的一个扩展函数。

在使用上面的扩展函数当中不需要每次再执行beginTransaction()和commit()方法。甚至我们还能够在inTransaction方法中执行多次操作。

supportFragmentManager.inTransaction {
    remove(fragmentA)    
    add(R.id.frameLayoutContent, fragmentB)
}

现在再次对inTransaction函数进行一次升级,可以将传入的Lambda函数添加一个返回值,返回FragmentTransaction对象。这样会使得我们的代码更加简洁。

inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> FragmentTransaction) {
    beginTransaction().func().commit()
}

使用扩展函数来替代ActivityUtil

现在就可以使用上面的inTransaction方法来写一些FragmentActivity的扩展函数来取代Java中的ActivityUtil类。那么就以对Fragment的add和replace操作为例写两个FragmentActivity的扩展函数addFragment和replaceFragment。

fun FragmentActivity.addFragment(fragment: Fragment, frameId: Int){
    supportFragmentManager.inTransaction { add(frameId, fragment) }
}


fun FragmentActivity.replaceFragment(fragment: Fragment, frameId: Int) {
    supportFragmentManager.inTransaction{replace(frameId, fragment)}
}

由于这些扩展函数是FragmentActivity的扩展函数。所以在这些扩展函数内部就能够直接访问到FragmentActivity中的supportFragmentManager。

使用上面的扩展函数,就可以通过一行代码在Activity中添加Fragment。

addFragment(fragment, R.id.fragment_container)

replaceFragment(fragment, R.id.fragment_container)

总结

通过上篇文章了解了Kotlin一些扩展函数。而在这篇文章中去通过对Fragment添加去了解扩展函数的意义以及对高阶函数的使用。当然通过扩展函数也能够更佳的完善一些SDK中一些不合理的API。还能够写出更漂亮简洁的代码。
--------------------- 
作者:无嘴小呆子 
来源:CSDN 
原文:https://blog.csdn.net/ljd2038/article/details/79680515 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KotlinFragment使用动态广播可以按照以下步骤进行: 1. 注册广播接收器 在 Fragment 中,可以通过 `requireActivity()` 方法获取到所在的 Activity,然后调用 `registerReceiver()` 方法注册广播接收器。如下所示: ```kotlin val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { // 处理接收到的广播 } } val filter = IntentFilter("com.example.ACTION") requireActivity().registerReceiver(receiver, filter) ``` 上述代码中,我们创建了一个名为 `receiver` 的匿名内部类,继承自 `BroadcastReceiver` 类,并实现了 `onReceive()` 方法来处理接收到的广播。然后,创建了一个名为 `filter` 的 `IntentFilter` 对象,用于指定所要接收的广播类型。最后,调用 `requireActivity().registerReceiver(receiver, filter)` 方法注册广播接收器。 2. 取消广播接收器 在 Fragment 销毁时,需要取消广播接收器的注册,以避免内存泄漏。可以在 `onDestroy()` 方法中调用 `requireActivity().unregisterReceiver(receiver)` 方法取消注册。完整代码如下所示: ```kotlin class MyFragment : Fragment() { private val receiver = object : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { // 处理接收到的广播 } } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // 创建视图 } override fun onResume() { super.onResume() val filter = IntentFilter("com.example.ACTION") requireActivity().registerReceiver(receiver, filter) } override fun onDestroy() { super.onDestroy() requireActivity().unregisterReceiver(receiver) } } ``` 上述代码中,我们将广播接收器的创建、注册和取消注册分别放在了 `onCreateView()`、`onResume()` 和 `onDestroy()` 方法中。这样做可以确保广播接收器的生命周期与 Fragment 的生命周期保持一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值