vertical tutorial studio personalizar android android-support-library android-design-library navigationview

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 ");