Cualquier mejora de código en agregar / replace fragment

Empecé a estudiar Kotlin y no conozco toda la funcionalidad del lenguaje.

La function se usa para mostrar el fragment en FrameLayout. La lógica es tal que la primera vez siempre debería add() el fragment y las próximas veces replace() . También en algunos casos necesito usar addToBackStack() y también en las mismas situaciones para desactivar el menu del lado izquierdo.

 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) } 

Pregunta: ¿Hay alguna posible mejora del código de function relacionado con las especificaciones del lenguaje de Kotlin para hacer que el código sea más limpio ya que ahora la function se ve como una masa?

Me gusta usar y dejar cuando tengo algún código relacionado con el uso de muchos controles variables y nulos

Entonces haría algo como esto:

 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) } 

He publicado un blog sobre la respuesta a continuación.

Escribiré una Extension function al FragmentManager que acepta un Lambda with Receiver como argumento.

 inline fun FragmentManager.inTransaction(func: FragmentTransaction.() -> Unit) { val fragmentTransaction = beginTransaction() fragmentTransaction.func() fragmentTransaction.commit() } 

Para agregar un fragment , podemos llamar así desde la Activity ahora:

 supportFragmentManager.inTransaction { add(R.id.frameLayoutContent, fragment) } 

La ventaja de esto es que no tenemos que llamar a beginTransaction() y commit() cada vez que agreguemos o reemplacemos un Fragment ahora. ¿Cuántas horas ha perdido la debugging solo para descubrir que ha perdido la invocación de commit() en Java?

A continuación, escribiré las Extension functions en 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) } } } 

De modo que ahora podemos agregar / replace el Fragment de cualquier Activity en una sola línea, sin ningún calificador adicional:

 addFragment(yourFragment, R.id.frameLayoutContent, "tag") replaceFragment(yourFragment, R.id.frameLayoutContent, "tag") 

Todo esta bien. Probablemente aquí

 if(backStackTag != null) fragmentTransaction.addToBackStack(fragment.javaClass.name) 

quieres agregar un fragment usando backStackTag como este

 if(backStackTag != null) fragmentTransaction.addToBackStack(backStackTag) 
  • Kotlin build no puede get classs creadas por SquidDatabase
  • El complemento de Kotlin falla Android Studio
  • Error "reference no resuelta" en Android Kotlin
  • ¿Cómo hacer inferencia tipo Kotlin desde la reflexión KClass?
  • ¿Por qué una reference no resuelta al intentar acceder a valores constantes?
  • Parse 2D Array en Kotlin
  • Configuración de oyentes de Android en Kotlin: uso del retorno en lambdas
  • kotlin-android null no se puede convertir a tipo no nulo kotlin.String