2015-07-06 9 views
22

Come dice il titolo, voglio sapere se esiste un modo per controllare le viste all'interno dell'intestazione NavigationView? (Tranne l'aggiunta o la rimozione dell'intestazione.)Esiste un modo per controllare le viste all'interno dell'intestazione di NavigationView?

Ad esempio: nell'intestazione, ho un avatar utente. Per impostazione predefinita, visualizza un'immagine ospite, ma dopo che l'utente ha effettuato l'accesso, verrà mostrato l'avatar reale.

Come può essere realizzato?

+0

Sta a te quello che si stanno gonfiando nell'intestazione vista. Puoi usare 'ImageView' in' LinearLayout' e cambiare ImageDrawable in modo dinamico. – Moinkhan

+0

Puoi mostrare maggiori dettagli, ex mia intestazione solo con textview all'interno di FrameLayout. –

+2

riferisci la mia risposta .. http://stackoverflow.com/a/30660069/3544839 ... – Moinkhan

risposta

52

Dopo l'aggiornamento della libreria di supporto alla versione 23.1.1 o superiore,

Si potrebbe fare questo -

View header = navigationView.getHeaderView(0); 
TextView text = (TextView) header.findViewById(R.id.textView); 

o se si dispone di più intestazioni

navigationView.getHeaderCount() 

Rif: https://code.google.com/p/android/issues/detail?id=190226#c31

7

Poiché non posso accettare un commento come risposta. Così, ho ripubblicare risposta Moinkhan' qui:

prima creare intestazione XML come lay_header.xml

<TextView 
    android:id="@+id/tvThought" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" /> 

sul file java gonfiare questa intestazione sopra in un TextView. come

TextView headerView = (TextView) LayoutInflater.from(this).inflate(R.layout.lay_header, null); 
headerView.setText("Your_thoght"); 

aggiungervi come HeaderView

navView = (NavigationView) findViewById(R.id.navView); 
navView.addHeaderView(headerView); 

Ecco fatto ...

è anche possibile controllare fuori a: Customising NavigationView - Adding dynamic headerView, Android Support Design Library

Molte grazie! E ancora, abbiamo bisogno di una funzione che permetta all'utente di accettare un commento come risposta!

0

semplicemente provare Cerca produttore view nella vostra attività:

tvUserName = (TextView) findViewById(R.id.tv_username); 

Funziona per me. Mio layout intestazione è:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="192dp" 
    android:background="?attr/colorPrimaryDark" 
    android:padding="16dp" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark" 
    android:orientation="vertical" 
    android:gravity="bottom"> 

    <TextView 
     android:id="@+id/tv_username" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:textAppearance="@style/TextAppearance.AppCompat.Body1"/> 

</LinearLayout> 

mio NavigationView in Layout di attività è:

<android.support.design.widget.NavigationView 
    android:id="@+id/nav_view" 
    android:layout_height="match_parent" 
    android:layout_width="wrap_content" 
    android:layout_gravity="start" 
    android:fitsSystemWindows="true" 
    app:headerLayout="@layout/drawer_header" 
    app:menu="@menu/menu_drawer"/> 

E BTW, mi sono imbattuto in un problema durante il gonfiaggio LinearLayout, in cui non sono forniti params di layout:

TextView headerView = (TextView) LayoutInflater.from(this).inflate(R.layout.lay_header, null); 
headerView.setText("Your_thoght"); 

Spero che aiuti.

+0

Non sembra che faccia riferimento all'ID di TextView di actuall. Come puoi differenziare o identificare l'attuale TextView che desideri quando hai più di una TextViews nel layout dell'intestazione? Suppongo che lo si gonfierà come una vista, quindi dalla vista si può ottenere il TextView con id? – Nerudo

+0

@Nerudo, beh, è ​​lì nel layout Header: android: id = "@ + id/tv_username". e facci riferimento per ID findViewById (R.id.tv_username); –

1

L'altro modo per fare questo sta usando il metodo "inflateHeaderView()" di oggetto NavigationView, come qui di seguito (Dopo aver utilizzato "setContentView()"):

View headerLayout = navigationView.inflateHeaderView(R.layout.yours_nav_header_layout); 

Dopo questo punto è possibile utilizzare "headerLayout "per accedere viste personalizzate nel layout di testa, come di seguito:

View cutomView = (TextView) headerLayout.findViewById(R.id.lay_sign_in); 

nel mio caso sto utilizzando il framework butterknife per iniettare View 'navigationView' come questo:

@Bind(R.id.nav_view) NavigationView navigationView; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ButterKnife.bind(this); 
    } 
+1

Questo metodo va bene fintanto che l'intestazione non è già definita nel xml di navigationview. in tal caso, chiamando inflateheaderview aggiunge un'ulteriore intestazione nel cassetto laterale. – RmK

Problemi correlati