2015-07-30 18 views
15

Nella mia app è presente un cassetto di navigazione che contiene un'intestazione e alcune voci dell'elenco. L'intestazione ha una vista testuale che voglio rendere cliccabile ma non riesco a farlo.Android: OnClick per l'intestazione del cassetto di navigazione non funzionante

Per ottenere l'id di questa visualizzazione di testo ho utilizzato il seguente codice, poiché si trova in un file di layout diverso rispetto a quello in setContentView in 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 contiene l'intestazione del cassetto di navigazione. Ha un oggetto chiamato casa. Devo renderlo cliccabile. Il codice sopra riportato è nel metodo onCreate.

+0

Non stai posizionando l'intestazione in NavigationView per caso, vero?NavigtionView internamente colloca l'intestazione in quello che diventa lo slot 0 in una vista ListView nidificata, quindi intercetta e scarta l'evento OnItemClicked per l'intestazione. Potrebbe essere la fonte del problema? Non del tutto sicuro del meccanismo in gioco, ma SE l'intestazione si trova in un NavigationView che avrebbe informazioni importanti. –

+0

Guardando attentamente ho scoperto che ho fatto solo quello che hai detto. C'è un modo per farlo funzionare in questo caso? Grazie !! – varunkr

+0

Probabilmente è meglio posizionare l'intestazione all'esterno della visualizzazione di navigazione. Oppure non usare affatto NavigationView (poiché in genere sembra causare più problemi di quanti ne risolva). È fondamentalmente un listview di fantasia rotto con il codice dell'adattatore per i menu (che non è una grande caratteristica). –

risposta

53

Per me le altre risposte non ha funzionato. Ho provato il codice qui sotto. So che è troppo tardi. Spero che questo possa aiutare alcuni.

Cosa ho fatto per accedere alla vista dell'intestazione.

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

per cliccando il punto di vista di testa, qui ho usato un LinearLayout di 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 
     } 
    }); 
+1

Ha funzionato come un fascino :) – ZeWolfe15

+0

Ha funzionato anche per me. !! Grazie mille :) – Kishore

+0

Ha funzionato per me! thx :) –

0

Non dimenticare di definire android:clickable="true" nel tuo xml TextView.

+0

Non funziona amico !! – varunkr

0

so che è tardi per coloro che affrontano lo stesso problema.

posto il layout dell'intestazione nella visualizzazione di navigazione come questo

questo è in 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"/> 

creare un layout, il nome layout_header_profile.xml e mettere il riempimento che cosa mai vista che si desidera .

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> 

allora questo file di layout di intestazione sarà nel vostro activity_main.xml solo

Quindi nel tuo MainActivity.java si può dichiarare come si fa vista dalla activity_main.xml ed eseguire azioni su di esso, senza particolari codice richiesto

fare come questo nel tuo 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(); 
     } 
    }); 

Spero che funziona Felice di codifica.

0

solo aggiungere questo al layout intestazione del file Xml

android:focusable="true" 
android:focusableInTouchMode="true" 
android:clickable="true" 
0

Prima recuperare vista intestazione

View headerView = navigationView.getHeaderView(0); 

E poi usa onClick Listener

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

      // code 
     } 
    }); 
Problemi correlati