Diseño de encabezado para obtener/buscar de NavigationView

4 minutos de lectura

Diseno de encabezado para obtenerbuscar de NavigationView
khusrav

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

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), no se puede encontrar la vista, devuelve nulo. Con versiones anteriores funcionaba 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?

Diseno de encabezado para obtenerbuscar de NavigationView
ianhanniballake

Conmutadores de la versión 23.1.0 NavigationView a usar un RecyclerView (en lugar del anterior ListView) y el encabezado se agrega como uno de esos elementos. Esto significa que no está disponible al instante para llamar findViewById() – se necesita un pase de diseño antes de adjuntarlo al NavigationView.

Para 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 vía XML y vía código.

Si todavía está usando 23.1.0, según el error relacionadopuede inflar el encabezado en código y usar findViewById() en ese:

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.

  • OnLayoutChangeListener requiere min sdk nivel 11, pero tengo 9 en mi aplicación. Cualquier idea por favor, cómo solucionarlo findViewById regresando null por NavigationView ¿encabezamiento?

    – Alejandro Farber

    18/10/2015 a las 20:40

  • @AlexanderFarber: el código que publiqué funciona con API 7

    – ianhanniballake

    18/10/2015 a las 21:10

  • Prefiero degradar libs. Introducir un error es como una firma de Google. Si la nueva versión tiene un error, entonces Google lanzó esa nueva versión

    – BamsBamx

    19/10/2015 a las 21:13

  • @GFPF – cuando llamas inflateHeaderViewadjunta la Vista para usted en la capa correcta en el RecyclerView con el padre correcto – algo que no se puede hacer externamente para NavigationView.

    – ianhanniballake

    3 de noviembre de 2015 a las 4:08

  • @RmK: gracias, actualicé para responder para reflejar las nuevas API agregadas en 23.1.1 para recuperar encabezados agregados a través de XML (ya que la solución anterior solo funcionó en encabezados agregados a través de código).

    – ianhanniballake

    17 de noviembre de 2015 a las 17:56

1646960827 208 Diseno de encabezado para obtenerbuscar de NavigationView
François Dermu

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

  • También puedes usar navigationView.getHeaderCount() en caso de que tenga más de 1 encabezado por cualquier motivo.

    – François Dermu

    13 noviembre 2015 a las 18:50

Así es como lo hice usando ButterKnife Y funciona para mi.

protected static class HeaderViewHolder {

    @BindView(R.id.button)
    Button button;

    HeaderViewHolder(View view) {
        ButterKnife.bind(this, view);
    }
}

y luego use este titular de vista como este:

View header = navigationView.getHeaderView(0);
headerViewHolder = new HeaderViewHolder(header);

  • Esto es perfecto cuando desea eliminar la lógica relacionada con Ver de su actividad. ¡Gran idea!

    – amoly

    29 de enero de 2017 a las 1:53

  • Está funcionando perfectamente con ButterKnife, gracias hermano.

    – Rajesh Naddy

    26 de julio de 2018 a las 6:39

1646960828 865 Diseno de encabezado para obtenerbuscar de NavigationView
Campino

Para mí, esa fue la misma situación con 23.1.0, después de la actualización, la excepción del puntero nulo se convirtió. En este caso el NavigatorView parece:

<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"/>

Probé la propuesta de solución de ianhanniballake pero no funciona. Luego inflé con la frase:

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

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

Diseno de encabezado para obtenerbuscar de NavigationView
indrit saveta

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

  • ¡Hola y bienvenido a Stack Overflow! Agregue un texto que explique cómo esto resuelve la pregunta anterior. ¡Gracias!

    – Jonathan

    19 de marzo de 2019 a las 17:23

1646960829 352 Diseno de encabezado para obtenerbuscar de NavigationView
jin lee

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

  • ¡Hola y bienvenido a Stack Overflow! Agregue un texto que explique cómo esto resuelve la pregunta anterior. ¡Gracias!

    – Jonathan

    19 de marzo de 2019 a las 17:23

1646960830 140 Diseno de encabezado para obtenerbuscar de NavigationView
Alex

En Kotlin, el código de @Francois Dermu sería como

val navigationView : NavigationView = findViewById(R.id.your_nav_view_id);
val header = navigationView.getHeaderView(0)
val textView = header.findViewById<TextView>(R.id.textView)

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad