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) 
  • Configuración de oyentes de Android en Kotlin: uso del retorno en lambdas
  • Android (Kotlin): sobrescribe el nombre para la input del logging de llamadas
  • Referencia no resuelta a la function en Kotlin Android
  • El complemento de Kotlin falla Android Studio
  • ¿Cómo hacer inferencia tipo Kotlin desde la reflexión KClass?
  • kotlin-android null no se puede convertir a tipo no nulo kotlin.String
  • Cómo acceder a una vista desde el layout especificado en headerLayout de NavigationView usando Kotlin en Android
  • No se puede acceder a val en Kotlin