ale*_*bel 9 android android-fragments kotlin
我已经开始学习Kotlin并且不知道该语言的所有功能.
该函数用于显示FrameLayout中的片段.逻辑是第一次它应该始终add()是片段,下一次它将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)
}
Run Code Online (Sandbox Code Playgroud)
问题:与Kotlin语言规范相关的功能代码是否有一些可能的改进,以使代码更清晰,因为现在该功能看起来像一个质量.
Bob*_*Bob 19
我发布了一个关于以下答案的博客.
我会写一个Extension function给FragmentManager它接受Lambda with Receiver作为参数.
inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> Unit) {
val fragmentTransaction = beginTransaction()
fragmentTransaction.func()
fragmentTransaction.commit()
}
Run Code Online (Sandbox Code Playgroud)
要添加一个fragment,我们可以从Activity现在这样调用:
supportFragmentManager.inTransaction {
add(R.id.frameLayoutContent, fragment)
}
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,我们不必打电话beginTransaction()和 commit()我们每次添加一次或更换Fragment了.你花了多少时间浪费调试才发现你错过commit()了Java中的调用?
接下来,我将写信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) }
}
}
Run Code Online (Sandbox Code Playgroud)
所以现在我们可以在一行中添加/替换Fragment任何Activity一个,而不需要任何额外的限定符:
addFragment(yourFragment, R.id.frameLayoutContent, "tag")
replaceFragment(yourFragment, R.id.frameLayoutContent, "tag")
Run Code Online (Sandbox Code Playgroud)
我喜欢用有和让我有与使用大量的局部变量和一些代码null检查
所以我会做这样的事情:
fun showFragment(fragment : Fragment,
isReplace: Boolean = true,
backStackTag: String? = null,
isEnabled: Boolean = true)
{
/* Defining fragment transaction */
with(supportFragmentManager.beginTransaction()) {
/* Select if to replace or add a fragment */
if(isReplace)
replace(R.id.frameLayoutContent, fragment, backStackTag)
else
add(R.id.frameLayoutContent, fragment)
/* Select if to add to back stack */
backStackTag?.let { addToBackStack(it) }
commit()
}
enableDrawer(isEnabled)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2451 次 |
| 最近记录: |