android - 我如何重构抽屉导航

标签 android kotlin navigation androidx

我想重构这部分代码,因为你可以看到有很多函数重复

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
}

如果您的 fragment 容器 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
}

关于android - 我如何重构抽屉导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56680807/

相关文章:

asp.net-mvc-4 - Durandal.js : change navigation options per area

android - 当最新版本具有更高的 minSDKversion 级别时,如何修复旧版本 android 应用程序中的错误?

android - 如何在我的邮件服务器中创建(或注册)新的 pop3 电子邮件帐户

android - Parcelables 不支持默认值。 Android 导航深层链接参数

java - 通过 UI Automator 查看器中的资源 ID 识别 espresso 中的元素

java - 使用货币代码解析(本地化)价格的正确方法?

java - 应用程序不会导航到下一个应用程序页面

java - Google Cloud Endpoint 在 Google APIs Explorer 中工作,但在 Android 上不工作(错误请求)

java - 具有多个文本和图像的 ListView

Gradle 上的 Android 应用程序 : Unable to merge dex