20

Ho provato navigazioneView dalla nuova libreria di progettazione di supporto Android. Voglio avere un headerview dinamico. Fondamentalmente, il mio headerview mostrerà qualcosa come la citazione del giorno. Mi piacciono circa 10 citazioni e voglio selezionare in modo casuale una citazione e visualizzare in una vista testuale nell'headView. Voglio anche aggiungere il metodo onClick per l'headerView.Personalizzazione di NavigationView - Aggiunta di intestazione dinamica, Libreria di progettazione supporto Android

Al momento, non vedo alcuna possibilità di modificare il layout dell'anteprima a livello di codice. Qualche suggerimento per implementarlo?

+0

Soluzione migliore in questo post: http://stackoverflow.com/questions/31241683/are-there-any-way-to-control-view-insde-navigationview-header/33358934#33358934 – GFPF

risposta

24

creare prima un colpo di testa di 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 ...

+0

Soluzione migliore in questo post: http://stackoverflow.com/questions/31241683/are-there-any-way-to-control-view-insde-navigationview-header/33358934 # 33358934 – GFPF

1

È possibile aggiungere l'intestazione personalizzata a livello di programmazione chiamando addHeaderView sul proprio navigationView o definendolo nel file di layout utilizzando app:headerLayout="@layout/myheader".

+0

migliore soluzione in questo post: http://stackoverflow.com/questions/31241683/are-there-any-way-to-control-view-insde-navigationview-header/33358934#33358934 – GFPF

2

enter image description here

creare layout dell'intestazione prendere visione del testo all'interno,

<TextView 
       android:id="@+id/profile_email_text" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_alignLeft="@id/profile_image" 
       android:layout_alignParentBottom="true" 
       android:layout_toLeftOf="@id/expand_account_box_indicator" 
       android:ellipsize="end" 
       android:maxLines="1" 
       android:paddingBottom="16dp" 
       android:singleLine="true" 
       android:clickable="true" 
       android:onClick="onSelectText" 
       android:text="[email protected]" 
       android:textColor="@color/body_text_2_inverse" 
       android:textSize="@dimen/text_size_medium" /> 

in onCreate,

((TextView) findViewById(R.id.profile_email_text)).setText("test"); 

creare metodo onSelectText nella vostra attività

public void onSelectText(View v){ 
     if(v.getId() == R.id.profile_email_text){ 
      Snackbar 
        .make(fab, "clicked on sub title", Snackbar.LENGTH_LONG) 
          //.setAction(R.string.snackbar_action, myOnClickListener) 
        .show(); 
      drawer_layout.closeDrawers(); 
     } 
    } 
+0

Soluzione migliore in questo post: http: //stackoverflow.com/questions/31241683/are-there-any-way-to-control-view-insde-navigationview-header/33358934#33358934 – GFPF

1

È possibile utilizzare findViewById() per accedere agli elementi di intestazione all'interno del NavigationView. Funziona anche se hai inizializzato l'intestazione con la proprietà headerLayout ad es. app:headerLayout="@layout/drawer_header". È quindi possibile modificare dinamicamente l'intestazione senza necessità di gonfiare o aggiungere una nuova intestazione.

@Override 
public boolean onNavigationItemSelected(final MenuItem menuItem) { 

... 

if(mNavItemId == R.id.drawer_item_1) 
{ 
    View headerView = mNavigationView.findViewById(R.id.drawer_header_root); 
    // Test modifying the size of the header root element (FrameLayout) 
    // when the first menu item is clicked. 
    LinearLayout.LayoutParams p = (LinearLayout.LayoutParams) headerView.getLayoutParams(); 
    p.height = p.height == 700 ? 400 : 700; 
    headerView.setLayoutParams(p); 
    return true; 
} 
... 

drawer_header.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="196dp" 
android:background="@color/drawer_header_bg" 
android:orientation="vertical" 
android:id="@+id/drawer_header_root"> 
... 

Penso Dhawal sta dicendo la stessa cosa, ma non era libero eccellente.

+0

Soluzione migliore in questo post: http://stackoverflow.com/questions/31241683/are-there-any-way-to-control-view-insde-navigationview-header/33358934#33358934 – GFPF

6
TextView txt2; 
txt2 = (TextView) navigationView.inflateHeaderView(R.layout.nav_header_main).findViewById(R.id.textView2); 
txt2.setText("wow! It works like a charm"); 
14

Dopo il nuovo aggiornamento libreria di supporto (23.1.1),

Si potrebbe fare questo -

Aggiungere il headerview nel app:headerLayout="@layout/drawer_header" all'interno NavigationView.

Quindi, è possibile accedervi,

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

0

mio essere questo link vi aiuterà a

slimier question

final NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view); 

View headView = navigationView.getHeaderView(0); 

((TextView) headView.findViewById(R.id.nav_title)).setText("New title"); 
0

Per prima cosa è necessario navigareViewView. NavigationView navigationView =(NavigationView)findViewById(R.id.nav_view);

Quindi intestazione. View header = navigationView.getHeaderView(0) Quindi textView. TextView text = (TextView) header.findViewById(R.id.textView); E infine è possibile impostare il testo che si desidera visualizzare. text.setText("Hello there");

Problemi correlati