web-dev-qa-db-fra.com

Android: OnClick pour l'en-tête du tiroir de navigation ne fonctionne pas

J'ai un tiroir de navigation dans mon application qui contient un en-tête et des éléments de liste. L'en-tête a un textview que je veux rendre cliquable mais je ne suis pas capable de le faire. 

Pour obtenir l'id de cette textview, j'ai utilisé le code suivant, car il se trouve dans un fichier de disposition différent de celui de setContentView dans onCreate.

    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 contient l'en-tête du tiroir de navigation. Il a un article nommé maison. J'ai besoin de le rendre cliquable. Le code ci-dessus est dans la méthode onCreate.

20
varunkr

Pour moi, d'autres réponses n'ont pas fonctionné. J'ai essayé le code ci-dessous . Je sais qu'il est trop tard. J'espère que cela aidera certains.

Ce que j'ai fait pour accéder à la vue d'en-tête.

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

pour cliquer sur les vues d'en-tête, j'ai utilisé ici une représentation linéaire de la vue d'ensemble

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

Ou

 headerview.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           // Your code here 
        }
    });
79
SimplyProgrammer

N'oubliez pas de définir Android:clickable="true" dans votre XML TextView.

0
frgnvola

je sais qu'il est tard c'est pour ceux qui font face au même problème. 

placez votre disposition d'en-tête dans la vue de navigation comme ceci 

c'est dans 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"/>

créez une mise en page, nommez-la layout_header_profile.xml et remplissez-la comme vous le souhaitez. 

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>

alors ce fichier de disposition d'en-tête sera dans votre activity_main.xml uniquement 

ainsi, dans votre MainActivity.Java, vous pouvez le déclarer comme vous visualisez à partir de activity_main.xml et y exécuter des actions. Aucun code spécial n'est requis. 

faites comme ça dans votre 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();
        }
    });

J'espère que cela fonctionne Code heureux.

0
Irfan

il suffit d'ajouter ceci à votre fichier XML d'en-tête

Android:focusable="true"
Android:focusableInTouchMode="true"
Android:clickable="true"
0
Nakhoda Sokoot

Première vue d'en-tête de récupération 

 View headerView = navigationView.getHeaderView(0);

Et puis utilisez onClick Listener 

  headerView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            // code
        }
    });
0
ANUJ GUPTA