¿Cómo configurar el headerView de NavigationView con Anko DSL?

En general, el layout XML, el layout principal pnetworkingeterminado es el siguiente:

<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="start"> <include layout="@layout/app_bar_main" android:layout_width="match_parent" android:layout_height="match_parent" /> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer" /> </android.support.v4.widget.DrawerLayout> 

Traté de codificar esto con Anko DSL:

 ... override fun createView(ui: AnkoContext<MainActivity>) = with(ui) { drawerLayout { lparams(width = matchParent, height = matchParent) id = ID_DRAWER_LAYOUT fitsSystemWindows = true navigationView { lparams(width = wrapContent, height = matchParent) id = ID_NAVIGATION_VIEW foregroundGravity = Gravity.START fitsSystemWindows = true addHeaderView(navHeaderView()) //// PROBLEM HERE //// inflateMenu(R.menu.activity_main_drawer) } } } private fun ViewGroup.navHeaderView() { linearLayout { lparams(width = matchParent, height = dip(160)) backgroundResource = R.drawable.side_nav_bar gravity = Gravity.BOTTOM orientation = LinearLayout.VERTICAL setPadding(dip(64), dip(16), dip(64), dip(16)) imageView { id = ID_IMAGE_VIEW topPadding = dip(16) imageResource = android.R.drawable.sym_def_app_icon } textView { lparams(width = matchParent, height = wrapContent) id = ID_TEXT_NAME topPadding = dip(16) text = "test1" if (Build.VERSION.SDK_INT >= 23) { setTextAppearance(R.style.TextAppearance_AppCompat_Body1) } else { setTextAppearance(context, android.R.style.TextAppearance_Medium) } } textView { id = ID_TEXT_DESCRIPTION text = "test2" } } } ... 

La línea marcada arroja una exception que dice que la vista ya tuvo un padre.


Luego traté de usar el plugin Anko DSL Preview para convertir el xml automáticamente, simplemente lo hice así, no lo cambié por completo en Anko DSL:

 android.support.v4.widget.DrawerLayout { id = Ids.drawer_layout include<View>(R.layout.app_bar_main).lparams(width = matchParent, height = matchParent) org.mewx.projectprpr.template.NavigationFitSystemView { id = Ids.nav_view app:headerLayout = @layout/nav_header_main //// HERE //// app:menu = @menu/activity_main_drawer }.lparams(width = wrapContent, height = matchParent) } 

¿Cómo puedo agregar la vista de encabezado con Anko DSL?

¡Gracias!

Primero, DrawerLayout en su constructor comtesting fistSystemWindows y establece el background de la barra de estado, por lo que, desafortunadamente, la forma más fácil de usar DrawerLayout con fitsSystemWindows es fitsSystemWindows desde XML.

En segundo lugar, los methods DSL de Anko no solo crean nuevas vistas, sino que también las vinculan a los padres. Debe crear una vista separada:

 addHeaderView(UI { navHeaderView() }.view) 

Este código está diseñado para usar con Anko 0.10.0-beta-2 , el comportamiento e incluso la syntax pueden variar de una versión a otra.

En tercer lugar, he detectado un error: cuando abro el cajón mientras se muestra el keyboard, la vista de encabezado obtiene un gran relleno inferior (recuadro). Mi triste solución se ve así:

 addHeaderView( object : _RelativeLayout(context) { // fixes bottomPadding with open keyboard :'( @TargetApi(20) override fun onApplyWindowInsets(insets: WindowInsets) = insets.consumeSystemWindowInsets() }.apply { /* DSL code here */ }) 
  • La configuration 'comstackr' está obsoleta, pero todas las configuraciones son 'implementación'
  • ¿Qué es un "receptor" en Kotlin?
  • Clases de objects nesteds de Kotlin
  • BluetoothSocket no se conecta al dispositivo de destino
  • Escribir un timer usando Handler en Kotlin
  • ¿Por qué `como` en Kotlin no echó en este caso
  • libgdx ground no funciona
  • Android: uso de generics para tener 1 llamada de actualización de RxJava que devuelve varios types usando la misma interfaz
  • ¿Cómo puedo configurar FlexBox.alignItems para flex_end programáticamente?
  • El depurador Android Studio no funciona cuando se usa la compatibilidad con C ++
  • ¿Cómo referirte a ti mismo en la class anónima?