gpt4 book ai didi

android - 添加/替换 fragment 的任何代码改进

转载 作者:IT老高 更新时间:2023-10-28 13:39:24 25 4
gpt4 key购买 nike

我已经开始学习 Kotlin,但不知道该语言的所有功能。

该函数用于在FrameLayout中显示 fragment 。逻辑是这样的,第一次它应该总是add() fragment ,下一次它会replace()。另外在某些情况下我需要使用 addToBackStack() 并且在相同的情况下也需要禁用左侧菜单。

fun showFragment(fragment : Fragment,
isReplace: Boolean = true,
backStackTag: String? = null,
isEnabled: Boolean = true)
{
/* Defining fragment transaction */
val fragmentTransaction = supportFragmentManager
.beginTransaction()

/* Select if to replace or add a fragment */
if(isReplace)
fragmentTransaction.replace(R.id.frameLayoutContent, fragment, backStackTag)
else
fragmentTransaction.add(R.id.frameLayoutContent, fragment)

/* Select if to add to back stack */
if(backStackTag != null)
fragmentTransaction.addToBackStack(fragment.javaClass.name)

fragmentTransaction.commit()
enableDrawer(isEnabled)
}

问题:是否有可能对 Kotlin 语言规范相关的函数代码进行一些改进,以使代码更清晰,因为现在函数看起来像一个整体。

最佳答案

我已经发布了 blog关于下面的答案。

我会写一个 Extension function到接受 Lambda with ReceiverFragmentManager作为论据。

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

要添加 fragment,我们现在可以从 Activity 中这样调用:

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

这样做的好处是我们不必在每次添加或替换 Fragment 时都调用 beginTransaction()commit() > 现在。你浪费了多少时间调试才发现你错过了在 Java 中调用 commit()

接下来,我将Extension functions写成AppCompatActivity:

fun AppCompatActivity.addFragment(fragment: Fragment, frameId: Int, backStackTag: String? = null) {
supportFragmentManager.inTransaction {
add(frameId, fragment)
backStackTag?.let { addToBackStack(fragment.javaClass.name) }
}
}

fun AppCompatActivity.replaceFragment(fragment: Fragment, frameId: Int, backStackTag: String? = null) {
supportFragmentManager.inTransaction {
replace(frameId, fragment)
backStackTag?.let { addToBackStack(fragment.javaClass.name) }
}
}

所以现在我们可以在一行中添加/替换任何 Activity 中的 Fragment,而无需任何额外的限定符:

addFragment(yourFragment, R.id.frameLayoutContent, "tag")

replaceFragment(yourFragment, R.id.frameLayoutContent, "tag")

关于android - 添加/替换 fragment 的任何代码改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45713747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com