support last android android-support-library android-design-library navigationview android-support-design

last - El soporte para Android v23.1.0 rompe la actualización NavigationView obtiene/encuentra el encabezado



implementation com android support design (5)

He estado usando la biblioteca de soporte v23.0.1 hasta ahora sin problemas. Ahora, cuando cambio a la nueva biblioteca v23.1.0 , obtengo un puntero nulo en los widgets en el diseño del cajón.

mNavigationView = (NavigationView) findViewById(R.id.navigation_view); TextView username = (TextView) mNavigationView.findViewById(R.id.username_textView); // ^^^^^^^^ is now null when using new library // which causes the following to fail username.setText(mUser.getName());

diseño de la actividad

<?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" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include layout="@layout/toolbar" /> ... </LinearLayout> <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/drawer_header" app:menu="@menu/drawer_items" /> </android.support.v4.widget.DrawerLayout>

drawer_header.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fresco="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="150dp" android:orientation="vertical"> <TextView android:id="@+id/username_textView" android:layout_width="match_parent" android:layout_height="0dp" /> ... </LinearLayout>

El simple hecho de cambiar el archivo de gradle para usar la versión anterior hace que funcione bien al instante, por lo que no creo que haya nada terriblemente mal con mi código. Revisé las revisions en la actualización y no vi nada de lo que pensaría que causaría esto.

Seguramente esto también estará afectando a los demás, ¿alguna pista?


Aparece adjuntando la vista de encabezado al cajón de navegación utilizando xml que actualmente está roto. La solución es inflar y adjuntar la vista manualmente.

diseño de la actividad

<android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/drawer_header" <!-- remove this line --> app:menu="@menu/drawer_items" />

Luego en su código infle y adjunte el encabezado haciendo lo siguiente.

NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view); View drawerHeader = navigationView.inflateHeaderView(R.layout.drawer_header); TextView username = (TextView) drawerHeader.findViewById(R.id.username_textView);


Con la biblioteca de diseño v 23.1.0, NavigationView funciona con un RecyclerView .
También el Header es ahora un tipo de fila.

Esto significa que el encabezado no podría estar disponible inmediatamente en la jerarquía de vistas .
Puede causar problemas si está utilizando métodos como navigationView.findViewById(XXX) para obtener una vista dentro del encabezado.

Hay un error en el code.google.com/p/android/issues/detail?id=190226 .

EDICIÓN 12/10/2015: Biblioteca de diseño 23.1.1

El 23.1.1 introduce una nueva API para recuperar vistas de encabezado para NavigationView con getHeaderView()

ANTES DE 23.1.1

la solución para el 23.1.0 puede ser usar un addOnLayoutChangeListener . Algo como:

navigationView.addOnLayoutChangeListener( new View.OnLayoutChangeListener() { @Override public void onLayoutChange( ... ) { navigationView.removeOnLayoutChangeListener( this ); View view = navigationView.findViewById( ... ); } } );

Otra posible solución es:

  • elimine el atributo app:headerLayout del xml y luego agregue el encabezado programáticamente.

  • Inflar el headerView programáticamente.

Use algo así como esto:

View headerLayout = navigationView.inflateHeaderView(R.layout.navigation_header); headerLayout.findViewById(xxx);


He actualizado las herramientas de compilación desde el administrador sdk de Android, luego 23.1.0 también funciona bien para mí.

estoy usando

buildToolsVersion "23.0.2"

antes de esto era el 23.0.1.

y no hay necesidad de usar

(View)navigationView.findViewById(R.id.idOfViewFromHeaderView);

En tu actividad puedes utilizar directamente.

(View)findViewById(R.id.idOfViewFromHeaderView);


en el nuevo NavigationView el encabezado ahora es un tipo de fila de RecyclerView para que usted o cualquiera pueda encontrar la view por su id . Necesitará solucionarlo y usar el addOnLayoutChangeListener escucha addOnLayoutChangeListener y luego podrá encontrar la view sé que debe documentarse. En algún lugar, pero Android es como meh !.