在添加/替换片段中的任何代码改进
我已经开始研究Kotlin,不知道这门语言的所有功能。
该函数用于在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) }
问题:为了使代码更清洁,现在函数看起来像一个块,是否有可能改进与Kotlin语言规范相关的函数代码。
我喜欢用和让我有一些代码相关的使用了很多变量和空检查
所以我会做这样的事情:
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) }
我已经发布了一个关于下面的答案的博客 。
我将向FragmentManager
写一个Extension function
,它接受一个Lambda with Receiver
的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) }
这样做的好处是,我们不必在每次添加或替换一个Fragment
时都调用beginTransaction()
和commit()
。 你花了多少个小时来浪费调试才发现你错过了在Java中调用commit()
?
接下来,我将向AppCompatActivity
写入Extension functions
:
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
,而不需要额外的限定符:
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)