在添加/替换片段中的任何代码改进

我已经开始研究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 ReceiverLambda 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)