¿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, Java, multidex, Dagger 2, Butterknife y Realm: transformClassesWithJarMergingForDebug: input duplicada: org / jetbrains / annotations / NotNull.class
  • Cómo inicializar widgets en Android usando kotlin
  • registerReceiver () muestra error por método sobrecargado
  • La variable de vista de Kotlin es inesperadamente nula en el método Activity onCreate
  • ¿Insertar o agregar un elemento en ArrayList en Kotlin?
  • kotlin jvmname ignorado por Gradle?
  • Referencia no resuelta: kotlinx - Kotlin 1-0-0-rc-1036
  • Android Studio 3 no puede build fragments de kotlin
  • Click listener en ViewHolder solo responde a veces
  • La propiedad en la interfaz no puede tener un campo de respaldo
  • Cómo usar null con kotlin @Parcelize