添加/替换片段的任何代码改进

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 functionFragmentManager它接受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 functionsAppCompatActivity:

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)

  • 发布了一个博客对此进行解释:https://medium.com/thoughts-overflow/how-to-add-a-fragment-in-kotlin-way-73203c5a450b (2认同)

Pel*_*cho 5

我喜欢用我有与使用大量的局部变量和一些代码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)