Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何重构导航抽屉_Android_Kotlin_Navigation_Androidx - Fatal编程技术网

Android 如何重构导航抽屉

Android 如何重构导航抽屉,android,kotlin,navigation,androidx,Android,Kotlin,Navigation,Androidx,我想重构这段代码,因为您可以看到有很多函数重复执行 override fun onNavigationItemSelected(menuItem: MenuItem): Boolean { when (menuItem.itemId) { R.id.home -> { homeFragment = HomeFragment() supportFragmentManager

我想重构这段代码,因为您可以看到有很多函数重复执行

override fun onNavigationItemSelected(menuItem: MenuItem): Boolean {
        when (menuItem.itemId) {

            R.id.home -> {
                homeFragment = HomeFragment()
                supportFragmentManager
                    .beginTransaction()
                    .replace(R.id.frame_layout, homeFragment)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    .commit()
            }

            R.id.loanable -> {
                loanableFragment = LoanableFragment()
                supportFragmentManager
                    .beginTransaction()
                    .replace(R.id.frame_layout, loanableFragment)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    .commit()
            }

            R.id.payable -> {
                payableFragment = PayableFragment()
                supportFragmentManager
                    .beginTransaction()
                    .replace(R.id.frame_layout, payableFragment)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    .commit()
            }

            R.id.compare_rate -> {
                compareRateFragment = CompareRateFragment()
                supportFragmentManager
                    .beginTransaction()
                    .replace(R.id.frame_layout, compareRateFragment)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    .commit()
            }
        }

        drawerLayout.closeDrawer(GravityCompat.START)
        return true
    }

您可以使用kotlin扩展函数使代码更加清晰

fun Fragment.replace() {
    supportFragmentManager
             .beginTransaction()
             .replace(R.id.frame_layout, this)
             .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
             .commit()
}

override fun onNavigationItemSelected(menuItem: MenuItem): Boolean { 
    when (menuItem.itemId) {
        R.id.home -> HomeFragment().replace()
        R.id.loanable -> LoanableFragment().replace()
        R.id.payable -> PayableFragment().replace()
        R.id.compare_rate -> CompareRateFragment().replace()
    }
    drawerLayout.closeDrawer(GravityCompat.START)
    return true
}
如果片段容器id不同:

infix fun Fragment.replaceTo(id: Int) {
    supportFragmentManager
             .beginTransaction()
             .replace(id, this)
             .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
             .commit()
}

override fun onNavigationItemSelected(menuItem: MenuItem): Boolean { 
     when (menuItem.itemId) {
        R.id.home -> HomeFragment() replaceTo R.id.frame_layout1
        R.id.loanable -> LoanableFragment() replaceTo R.id.frame_layout2
        R.id.payable -> PayableFragment() replaceTo R.id.frame_layout3
        R.id.compare_rate -> CompareRateFragment() replaceTo R.id.frame_layout4
    }
    drawerLayout.closeDrawer(GravityCompat.START)
    return true
}

为什么不使用enum和一些很酷的语言特性呢

enum class NavigationItem(@IdRes val id: Int, val createFragment: ()-> Fragment) {
  HOME(R.id.home, ::HomeFragment),
  LOANABLE(R.id.loanable, ::LoanableFragment),
  PAYABLE(R.id.payable, ::PayableFragment),
  COMPARE_RATE(R.id.compare_rate, ::CompareRateFragment)
}

override fun onNavigationItemSelected(menuItem: MenuItem) =
  requireNotNull(enumValues<NavigationItem>().find { it.id == menuItem.itemId })
    .createFragment()
    .let { fragment ->
       supportFragmentManager
         .beginTransaction()
         .replace(R.id.frame_layout, fragment)
         .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
         .commit()
       drawerLayout.closeDrawer(GravityCompat.START)
    }.run { true }
在枚举中搜索与所选
menuItem
具有相同
id
的条目。若找不到条目,则引发异常。行:

createFragment()
只需从枚举项调用片段的构造函数引用,创建新的片段实例。片段事务应该是可以理解的。最后一行:

run { true }

从函数返回true,与原始代码一样。

有趣的代码,也是我第一次看到使用
infix
。谢谢分享。
run { true }