NavigationView obtener / buscar el diseño del encabezado

En mi NavigationView tengo un diseño de encabezado con id 'viewId' con botones activos. Para configurar esos botones, hago lo siguiente en onPostCreate la actividad:

 final View panel = findViewById(R.id.viewId); panel.setOnClickListener(new View.OnClickListener() { ... setup goes here ... }); 

Con la nueva versión de la biblioteca de soporte para Android, ( 23.1.0 ), la vista no se puede encontrar, devuelve null. Con versiones anteriores funcionó bien. ¿Es un error o estoy usando esta función mal? En caso afirmativo, ¿cómo acceder al diseño de la cabecera y añadirle un comportamiento?

La versión 23.1.0 cambia NavigationView a usar un RecyclerView (en lugar del ListView anterior) y el encabezado se agrega como uno de esos elementos. Esto significa que no es instantáneamente disponible para llamar a findViewById() – un pase de diseño es necesario antes de que se adjunta a la NavigationView .

Para la versión 23.1.1 de la Biblioteca de soporte, ahora puede obtener una referencia a la vista de encabezado mediante getHeaderView() :

 View headerLayout = navigationView.getHeaderView(0); // 0-index header 

Esto tiene la ventaja de trabajar en los encabezados agregados vía XML y vía código.

Si sigue utilizando 23.1.0, según el error relacionado , puede inflar el encabezado en el código y utilizar findViewById() en que:

 View headerLayout = navigationView.inflateHeaderView(R.layout.navigation_header); panel = headerLayout.findViewById(R.id.viewId); // panel won't be null 

Hasta que se mueva a 23.1.1.

Ahora con la versión 23.1.1 de la biblioteca de soporte de diseño, puede utilizar

 NavigationView navigationView = (NavigationView) findViewById(R.id.your_nav_view_id); View header = navigationView.getHeaderView(0) TextView text = (TextView) header.findViewById(R.id.textView); 

Para mí que era la misma situación con 23.1.0, después de la actualización de la excepción de puntero nulo convertido. En este caso, el NavigatorView tiene el siguiente aspecto:

  <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_height="match_parent" android:layout_width="wrap_content" android:layout_gravity="start" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header" app:menu="@menu/menu_nav" /> 

He intentado la propuesta de solución por ianhanniballake pero no funciona. Luego me hinché con la oración:

  LayoutInflater.from(getContext()).inflate(R.layout.nav_header, mNavigationView); 

Después de eso, puedo encontrar por id todas las vistas definidas en nav_heard.

Así es como lo hice con ButterKnife y funciona para mí.

 protected static class HeaderViewHolder { @BindView(R.id.button) Button button; HeaderViewHolder(View view) { ButterKnife.bind(this, view); } } 

Y luego utilizar este titular de vista como este:

 View header = navigationView.getHeaderView(0); headerViewHolder = new HeaderViewHolder(header); 
  • Cómo dar color de texto personalizado para un solo elemento de menú en un NavigationView?
  • Cómo poner el botón Cerrar sesión de Facebook al final de la vista de navegación
  • Cómo obtener divisores en el menú de NavigationView sin títulos?
  • Elementos del menú de NavigationView con el contador a la derecha
  • ¿Cómo cambiar la dirección de los iconos para los elementos del menú en un NavigationView?
  • Translúcido StatusBar con el color dinámico ActionBar en Android
  • NavigationView selecciona el elemento seleccionado como
  • Cambiar Navegación Ver color del elemento Dinámicamente Android
  • Cambiar la separación entre el grupo de encabezados y el primer elemento
  • NavigationView y diseño personalizado
  • ¿Agregar MenuItem a NavigationView con el icono y el título?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.