android - tutorial - personalizar navigation view
NavigationView obtener/buscar diseƱo de encabezado (5)
Ahora con la versión 23.1.1 de la biblioteca de soporte de diseño, puede usar
NavigationView navigationView = (NavigationView) findViewById(R.id.your_nav_view_id);
View header = navigationView.getHeaderView(0)
TextView text = (TextView) header.findViewById(R.id.textView);
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 de Android, ( 23.1.0 ), la vista no se puede encontrar, devuelve nulo. Con versiones anteriores funcionó bien. ¿Es un error o estoy usando mal esta función? Si es así, ¿cómo acceder al diseño del encabezado y agregarle comportamiento?
Así es como lo hice usando
ButterKnife
y funciona para mí.
protected static class HeaderViewHolder {
@BindView(R.id.button)
Button button;
HeaderViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
y luego use este soporte de vista de esta manera:
View header = navigationView.getHeaderView(0);
headerViewHolder = new HeaderViewHolder(header);
La versión 23.1.0 cambia el
NavigationView
a un
RecyclerView
(en lugar del
ListView
anterior) y el encabezado se agrega como uno de esos elementos.
Esto significa que no está disponible al instante para llamar a
findViewById()
: se necesita un pase de diseño antes de adjuntarlo a
NavigationView
.
Para la
versión 23.1.1
de la Biblioteca de soporte, ahora puede obtener una referencia a la vista de encabezado usando
getHeaderView()
:
View headerLayout = navigationView.getHeaderView(0); // 0-index header
Esto tiene la ventaja de trabajar en encabezados agregados a través de XML y código.
Si todavía usa 23.1.0, según
el error relacionado
, puede inflar el encabezado en el código y usar
findViewById()
en eso:
View headerLayout =
navigationView.inflateHeaderView(R.layout.navigation_header);
panel = headerLayout.findViewById(R.id.viewId);
// panel won''t be null
Hasta que pases a 23.1.1.
Para mí esa era la misma situación con 23.1.0, después de la actualización se convirtió en la excepción de puntero nulo.
En este caso, el
NavigatorView
parece a:
<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"/>
Intenté la propuesta de solución de ianhanniballake pero no funciona. Luego inflé 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 el diseño
nav_heard
.
NavigationView navigationView = findViewById(R.id.your_nav_view);
View header = navigationView.getHeaderView(0);
TextView textUsername = header.findViewById(R.id.textView);
textUsername.setText("you text here ");