¿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 */ }) 
  • Excepción de puntero nulo en Spring Proxy Class y Kotlin
  • Extensión de Kotlin para el próximo valor de Enum sin reflexión
  • Cómo convertir java.util.stream.Stream <Something> en kotlin.Sequence <Something>
  • GridView solo elimina el primer elemento cuando se hace clic en un elemento. Java-> Kotlin
  • ¿Cómo configurar Jacoco con Spek en un proyecto múltiple?
  • Android Kotlin Dagger2 proporciona gson: el parámetro especificado como no nulo es nulo
  • Obtenga una date de un DatePickerDialog en Kotlin Android
  • ¿Es posible un portlet Kotlin Liferay?
  • Funciones de extensión en types anotados
  • Kotlin: Evite crear FqNameUnsafe y FqName
  • Tornadofx - Cómo pasar el parámetro a Fragment en cada instancia