Come cambiare il testo di un TextView nell'intestazione del cassetto di navigazione?


89

Voglio cambiare il testo di un TextView all'interno dell'intestazione del cassetto di navigazione. Ma ottengo questo errore:

java.lang.NullPointerException: tentativo di richiamare il metodo virtuale 'void android.widget.TextView.setText (java.lang.CharSequence)' su un riferimento a un oggetto nullo


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <include
            layout="@layout/app_bar_main"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <FrameLayout
            android:id="@+id/frame_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>

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

</android.support.v4.widget.DrawerLayout>

nav_header_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="@dimen/nav_header_height"
    android:background="@drawable/slide_nav_bar"
    android:gravity="bottom"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:theme="@style/ThemeOverlay.AppCompat.Dark">

    <ImageView
        android:id="@+id/tvHeaderIcon"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:paddingTop="@dimen/nav_header_vertical_spacing"
        android:src="@android:drawable/sym_def_app_icon" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="@dimen/nav_header_vertical_spacing"
        android:text="@string/app_name"
        android:textAppearance="@style/TextAppearance.AppCompat.Body1" />

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

</LinearLayout>

MainActivity.java

TextView tvHeaderName;

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    tvHeaderName= (TextView) findViewById(R.id.tvHeaderName);
    tvHeaderName.setText("Saly");    
}

Come posso fare questo?

Risposte:


274

Usa getHeaderView`sulla tua navigationView

NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
View headerView = navigationView.getHeaderView(0);
TextView navUsername = (TextView) headerView.findViewById(R.id.navUsername);
navUsername.setText("Your Text Here");

3
Per aggiornare in modo affidabile un TextViewin un'intestazione del cassetto di navigazione, utilizzare questo codice nel ActionBarDrawerToggle.onDrawerOpened()metodo. Vedi: stackoverflow.com/a/35952939/1657502 .
Antonio Vinicius Menezes Medei

Saver mate. Dio ti benedica: D
Biswajit Das

9

Dovresti prima gonfiare il layout dell'intestazione da NavigationView ...

navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main);
tvHeaderName= (TextView) navHeaderView.findViewById(R.id.tvHeaderName);
tvHeaderName.setText("Saly"); 

3
Per me inflateHeaderView non ha funzionato. Ho usato invece getHeaderView (0).
Zeezer

6
Questa soluzione non funziona correttamente. Questo mostra l'intestazione due volte. L'uso di getHeaderView (0) funziona.
AlphaDeveloper

1
@BereketGobeze ha la risposta corretta, non funziona correttamente
touchofsarcasm

Se rimuovi la riga successiva dal file XML, questa soluzione funziona bene anche app: headerLayout = "@ layout / nav_header_main"
Pablo Insua

7

Ecco la versione Kotlin del codice, spero che aiuti qualcuno là fuori.

val navigationView : NavigationView  = findViewById(R.id.nav_view)
val headerView : View = navigationView.getHeaderView(0)
val navUsername : TextView = headerView.findViewById(R.id.txtUserName)
val navUserEmail : TextView = headerView.findViewById(R.id.txtEmail)

navUsername.text = username.toString()
navUserEmail.text = email.toString()

6

È inoltre possibile utilizzarlo a partire dalla libreria di supporto alla progettazione 23.1.1

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

Riferimento: https://stackoverflow.com/a/33692431/2761923


3
  1. Devi ottenere l'ID NavigationView nella tua attività in questo modo

    NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView );
    
  2. Ora ottieni il layout HeaderView usando l'ID Navigationview come questo

    View headerView = navigationView.getHeaderView(0);
    
  3. Ora puoi ottenere Any view id ed eseguire l'azione come desideri esempio

    TextView navUsername = (TextView) headerView.findViewById(R.id.navUsername);
    navUsername.setText("Your Text Here");
    

Ha funzionato per me oggi
Arsalan Fakhar

0

Usalo per ottenere l'intestazione di navigazione

View hview = navigationView.getHeaderView(0);

quindi usa hview per ottenere le diverse visualizzazioni dell'intestazione di navigazione e fai quello che vuoi

altrimenti usare navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main); questo sta creando una nuova intestazione all'indice 1.


0

Inizialmente, dobbiamo ottenere l'istanza della vista di navigazione gonfiando la vista di navigazione in una vista variabile, in seguito puoi ottenere l'istanza di textView per modificare la vista di testo


0

Cosa ha funzionato per me? è questo:-

 View linearLayout=navigationView.inflateHeaderView(R.layout.nav_header_main);
      TextView name =  linearLayout.findViewById(R.id.welcomenametext);

Ma ricorda di rimuoverlo dal tuo file xml, cioè da NavigationView: -app:headerLayout="@layout/nav_header_main"


Ok a parte questa risposta di cui sopra .. per mesi ora ho pensato che c'è un modo migliore per farlo se sei abbastanza avanzato nello sviluppo Android !! Basta inserire il layout del frame lì e caricare il frammento all'interno del quale abbiamo Recyclerview e la sezione di intestazione. Con Recyclerview puoi impostare l'intestazione come preferisci con visualizzazioni di testo, immagini e molti altri come preferisci. La recente applicazione su cui sto lavorando ha fatto proprio questo: ha passato dinamicamente i dati a Recyclerview da fragmentactivity senza icone e ha anche inserito un layout relativo (all'interno di textviews e imageview) che funge da intestazione sopra Recyclerview.


0

Questo ha funzionato per me:

NavigationView navigationView = findViewById(R.id.nav_view);
View headerView = navigationView.getHeaderView(0);
TextView title = headerView.findViewById(R.id.nav_title);
TextView subTitle = headerView.findViewById(R.id.nav_sub_title);

0
val navigationView = findViewById<View>(R.id.nav_view_home) as NavigationView
        val headerView = navigationView.getHeaderView(0)
        val tvUserName = headerView.findViewById<View>(R.id.tvUserName) as TextView
        tvUserName.text=(Preference.getInstance("your text")

-1

Ho lo stesso problema, ma entrambe le soluzioni fornite non hanno funzionato per me

java.lang.IllegalStateException: la vista richiesta "nav_header_username" con ID 2131296646 per il campo "username" non è stata trovata. Se questa visualizzazione è facoltativa, aggiungi l'annotazione "@Nullable" (campi) o "@Optional" (metodi).

Ho quasi lo stesso codice pubblicato sopra:

NavigationView navigationView = (NavigationView)findViewById(R.id.navigation_content);
View headerView = navigationView.inflateHeaderView(R.layout.nav_header);
TextView navUsername = (TextView) headerView.findViewById(R.id.nav_header_username);
navUsername.setText("Hello, "+mUserSession.getLoggedUserData().getmFirstName());

Questo non risponde alla domanda dell'OP
Nikolai Shevchenko
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.