Android: OnClick para el encabezado del cajón de navegación no funciona
Tengo un cajón de navegación en mi aplicación que contiene un encabezado y algunos elementos de la lista. El encabezado tiene un textview que quiero hacer clickable pero no soy capaz de hacerlo.
Para obtener el id de este textview utilicé el siguiente código, ya que está en un archivo de diseño diferente en comparación con el de la setContentView en onCreate.
- Haga clic en el elemento de lista de un ListView no responde
- ¿Cómo exactamente el atributo android: onClick XML difiere de setOnClickListener?
- Inicie otra actividad haciendo clic en un botón
- Cambiar el fondo ListView - comportamiento extraño
- Cómo ejecutar "callOnClick ()" para Android API 8?
final LayoutInflater factory = getLayoutInflater(); final View textEntryView = factory.inflate(R.layout.header, null); TextView home = (TextView) textEntryView.findViewById(R.id.home); home.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(curr_context, "SHOW", Toast.LENGTH_LONG).show(); } });
Header.xml contiene el encabezado del cajón de navegación. Tiene un artículo llamado casa. Necesito hacer clicable. El código anterior está en el método onCreate.
- efecto de clic de cuadrícula
- Android: Cómo propagar el evento de clic a los hijos de LinearLayout y cambiar su drawable
- Establecer determinado elemento en la vista de cuadrícula que no se puede hacer clic
- ¿Cómo evitar disparar varias veces un evento onClick cuando el usuario presiona el botón más de una vez realmente rápido?
- Android no puede encontrar el método desde el botón onClick en ListView Row
- Android se congela cuando hay una NullPointerException en OnClickListener.onClick (otras tareas no se pueden iniciar)
- Las guías de la API de Android son un poco confusas para mí sobre el atributo android: onClick XML
- Android: ¿Cómo vas a otra actividad al hacer clic?
Para mí, otras respuestas no funcionaron. He intentado el código abajo. Sé que es demasiado tarde. Espero que esto ayude a algunos.
Lo que hice para acceder a la vista de cabecera.
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); View headerview = navigationView.getHeaderView(0); TextView profilename = (TextView) headerview.findViewById(R.id.prof_username); profilename.setText("your name")
Para hacer clic en las vistas de la cabecera, aquí he utilizado un lineallayout de headerview
LinearLayout header = (LinearLayout) headerview.findViewById(R.id.header); header.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(HomeActivity.this, "clicked", Toast.LENGTH_SHORT).show(); drawer.closeDrawer(GravityCompat.START); } });
O
headerview.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Your code here } });
No olvides definir android:clickable="true"
en tu TextView xml.
Sé que es tarde esto es para aquellos que enfrentan el mismo problema.
Coloque el diseño de encabezado en la vista de navegación como este
Esto es en activity_main.xml
<android.support.design.widget.NavigationView android:id="@+id/navigationView" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" android:layout_marginTop="-24dp" app:itemTextColor="@color/black" app:headerLayout="@layout/layout_header_profile" app:menu="@menu/nav_menu"/>
Crear un diseño, el nombre de layout_header_profile.xml y poner el relleno lo que vista que desea.
layout_header_profile.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="178dp" android:orientation="vertical" android:weightSum="1" > <LinearLayout android:layout_width="match_parent" android:layout_height="56dp" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:orientation="vertical"> <TextView android:id="@+id/id_user_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="16dp" android:text="Irfan" android:textSize="14sp" android:textStyle="bold" /> <TextView android:id="@+id/id_user_email" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="16dp" android:layout_marginTop="5dp" android:text="[email protected]" android:textSize="14sp" android:textStyle="normal" /> </LinearLayout> <ImageView android:id="@+id/id_profile_image" android:layout_width="70dp" android:layout_height="70dp" android:layout_marginLeft="16dp" android:layout_marginTop="38dp" android:src="@mipmap/ic_profile_pic" /> </RelativeLayout>
Entonces este archivo de diseño de cabecera estará en su activity_main.xml solamente
Por lo que en MainActivity.java se puede declarar al hacer vistas desde activity_main.xml y realizar acciones en él, sin necesidad de código especial.
Hacer esto en su onCreate ()
TextView tvUserName = (TextView) findViewById(R.id.id_user_name); tvUserName.setText("My Name"); tvUserName.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getBaseContext(),"clicking textview",Toast.LENGTH_LONG).show(); } });
Espero que funcione Codificación feliz.
Sólo tiene que añadir esto a su archivo Xml de diseño de cabecera
android:focusable="true" android:focusableInTouchMode="true" android:clickable="true"
Vista de la primera cabecera de la cabecera
View headerView = navigationView.getHeaderView(0);
Y luego usa onClick Listener
headerView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // code } });