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?
- DrawerLayout con NavigationView - no mostrar el efecto de rizo en el clic
- NavigationView diapositiva desde la derecha
- NavigationView no está visible pero el clic de artículo está funcionando
- Cómo cambiar el tamaño del icono de elemento de menú en NavigationView?
- Agregar hijo a un MenuItem dentro de un grupo en un NavigationView
- Agregue un separador de sección para el Cajón de navegación en Android
- ¿Cómo diseñar el NavigationView de la biblioteca de soporte de diseño?
- Error de lanzamiento de NavigationView: No se encontró ningún identificador de recurso para el atributo 'menu' en el paquete
- Actividades o Fragmentos en NavigationView?
- NavigationView cómo manejar contenido de encabezado dinámico
- ClassNotFoundException: No encontró la clase "android.support.design.R $ styleable"
- La suspensión de soporte de Android v23.1.0 se desplaza
- Cómo obtener el ID de submenú en la vista de navegación
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);
- Datepicker: Cómo hacer popup datepicker cuando haga clic en edittext
- ¿Cómo puedo hacer una llamada telefónica en android y volver a mi actividad cuando se realiza la llamada?