Я начал изучать Котлин и не знаю всей функциональности языка.
Эта функция используется для отображения фрагмента в 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) }
Вопрос: Существуют ли какие-либо возможные улучшения функционального кода, связанные с спецификациями языка Котлин, чтобы сделать код более чистым, так как теперь функция выглядит как масса.
Мне нравится использовать и позволять, когда у меня есть код, связанный с использованием большого количества переменных и нулевых проверок
Поэтому я бы сделал что-то вроде этого:
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) }
Я опубликовал блог о нижнем ответе.
Я напишу функцию Extension function
для FragmentManager
которая принимает Lambda with Receiver
в качестве аргумента.
inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> Unit) { val fragmentTransaction = beginTransaction() fragmentTransaction.func() fragmentTransaction.commit() }
Чтобы добавить fragment
, мы можем вызвать это сейчас из Activity
:
supportFragmentManager.inTransaction { add(R.id.frameLayoutContent, fragment) }
Преимущество этого заключается в том, что нам не нужно вызывать beginTransaction()
и commit()
каждый раз, когда мы добавляем или заменяем Fragment
. Сколько часов вы потратили впустую на отладку, чтобы узнать, что вы пропустили вызов commit()
в Java?
Затем я напишу Extension functions
для AppCompatActivity
:
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) } } }
Так что теперь мы можем добавлять / заменять Fragment
из любой Activity
в одной строке без каких-либо дополнительных квалификаторов:
addFragment(yourFragment, R.id.frameLayoutContent, "tag") replaceFragment(yourFragment, R.id.frameLayoutContent, "tag")
Все отлично. Вероятно, здесь
if(backStackTag != null) fragmentTransaction.addToBackStack(fragment.javaClass.name)
вы хотите добавить фрагмент, используя backStackTag
как это
if(backStackTag != null) fragmentTransaction.addToBackStack(backStackTag)