¿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)) .

  • Genéricos Java vs Kotlin
  • La biblioteca de Android no puede comstackr kotlin
  • Quiero agregar mi versión de kotlin al proyecto Gradel
  • Extensiones de Kotlin para Android, los packages no se pueden importar
  • No se pudo encontrar la class 'kotlin.jvm.internal.DefaultConstructorMarker'
  • ¿Por qué la configuration de OnClickListener funciona una vez?
  • Encuadernación con vista de Android Kotlin: findViewById vs Butterknife vs Kotlin Android Extension
  • Función de extensión de llamada dentro de la class Java como cualquier operador de RX
  • Kotlin || ¿No puedo agregar la biblioteca a Mi aplicación?
  • Cómo modificar la variable de instancia de AsyncTask por separado
  • Métodos estáticos como en la aplicación de Android con kotlin