¿Cómo hacer AppBar universal con Anko DSL?

Intento crear una barra de herramientas que pueda insert en otros componentes de Anko. Aquí hay un ejemplo de lo que estoy buscando:

class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) MainUI().setContentView(this) val toolbar: Toolbar = find(R.id.toolbar) setSupportActionBar(toolbar) } } class MainUI : AnkoComponent<MainActivity> { override fun createView(ui: AnkoContext<MainActivity>) = with(ui) { coordinatorLayout { fitsSystemWindows = true lparams { width = matchParent height = matchParent } ToolbarUI().createView(ui).lparams { width = matchParent } recyclerView {...}.lparams { width = matchParent height = matchParent behavior = AppBarLayout.ScrollingViewBehavior() } } } } class ToolbarUI : AnkoComponent<AppCompatActivity> { override fun createView(ui: AnkoContext<AppCompatActivity>) = with(ui) { appBarLayout { ... toolbar { setTitleTextColor(Color.WHITE) id = R.id.toolbar title = resources.getString(R.string.main_activity) ... }.lparams { width = matchParent height = wrapContent } } } } 

De esta forma podría usar este mismo AppBarLayout en otro lugar con mucho less código. Pero estoy obteniendo esto: java.lang.IllegalStateException: View is already set: org.jetbrains.anko.design._AppBarLayout

¿Alguien podría ayudarme con la forma correcta de implementar esto?

Pude hacerlo con ViewManager basado en esta respuesta .

Aquí está el nuevo código:

 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) MainUI().setContentView(this) val toolbar: Toolbar = find(R.id.toolbar) setSupportActionBar(toolbar) } } class MainUI : AnkoComponent<MainActivity> { override fun createView(ui: AnkoContext<MainActivity>) = with(ui) { coordinatorLayout { fitsSystemWindows = true lparams { width = matchParent height = matchParent } toolbarUI(resources.getString(R.string.main_activity)).lparams { width = matchParent } recyclerView {...}.lparams { width = matchParent height = matchParent behavior = AppBarLayout.ScrollingViewBehavior() } } } fun ViewManager.toolbarUI(activity: String) = appBarLayout { toolbar { setTitleTextColor(Color.WHITE) id = R.id.toolbar title = activity }.lparams { width = matchParent height = wrapContent } } } 

El problema es que ToolbarUI().createView(ui) crea una vista en el mismo AnkoContext, en ui , que se crea con setContentView = true de manera pnetworkingeterminada. Puede intentar usar otro AnkoContext, que no va a adjuntar vista a Activity: ToolbarUI().createView(AnkoContextImpl(activity, this /* parent ViewGroup */, true)) .

  • Kotlin - Lista dentro de un filter de list
  • No se pueden agregar las extensiones de Kotlin para Android a mi proyecto
  • Llamadas seguras en Kotlin con Array es confuso
  • Tipo de parámetro Kotlin no coincide
  • La variable de vista de Kotlin es inesperadamente nula en el método Activity onCreate
  • Dagger2 inyecta un presentador en un error de actividad de Kotlin
  • Kotlin Objetos de carga demorada
  • Dagger2 no genera classs Dagger
  • Tipo de interferencia fallida. No coinciden los types esperados: requiere un par de cadenas encontrado <String, String> en Kotlin y Anko
  • La function Kotlin requiere nada, pero se define como un tipo diferente
  • Extensión de Kotlin Any? .toString ()