Как я могу реорганизовать навигационный ящик - PullRequest
2 голосов
/ 20 июня 2019

Я хотел бы провести рефакторинг этого раздела кода, так как вы можете видеть, что много функций повторяется

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
    }

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Почему бы не использовать 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 }

Вот и все;)

Перечисление содержит меню itemId и ссылку на целевой конструктор фрагмента.Строка:

requireNotNull(enumValues<NavigationItem>().find { it.id == menuItem.itemId })

ищет перечисление для записи, которая имеет тот же id, что и выбранный menuItem.Если запись не найдена, генерируется исключение.Строка:

createFragment()

просто вызывает ссылку на конструктор фрагмента из записи enum, создавая новый экземпляр фрагмента.Фрагмент транзакции должен быть понятен.Последняя строка:

run { true }

возвращает true из функции, как в исходном коде.

1 голос
/ 20 июня 2019

Вы можете использовать функцию расширения 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
}

Если ваш идентификатор контейнера фрагмента отличается:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...