Почему бы не использовать 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 из функции, как в исходном коде.