Wie ändere ich den Text einer Textansicht in der Kopfzeile der Navigationsleiste?

84

Ich möchte den Text einer Textansicht in der Kopfzeile der Navigationsleiste ändern. Aber ich bekomme diesen Fehler:

java.lang.NullPointerException: Versuch, die virtuelle Methode 'void android.widget.TextView.setText (java.lang.CharSequence)' für eine Nullobjektreferenz aufzurufen


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

Wie kann ich das machen?

Salar Rastari
quelle

Antworten:

266

Verwenden Sie getHeaderView in Ihrer Navigationsansicht

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");
Bereket Gobeze
quelle
3
TextViewVerwenden Sie diesen Code in der ActionBarDrawerToggle.onDrawerOpened()Methode , um einen Header in einer Navigationsleiste zuverlässig zu aktualisieren . Siehe: stackoverflow.com/a/35952939/1657502 .
Antonio Vinicius Menezes Medei
Sparer Kumpel. Gott segne dich: D
Biswajit Das
9

Sie sollten Ihr Header-Layout zuerst in NavigationView aufblasen ...

navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main);
tvHeaderName= (TextView) navHeaderView.findViewById(R.id.tvHeaderName);
tvHeaderName.setText("Saly"); 
Ashutosh Verma
quelle
3
Bei mir hat inflateHeaderView nicht funktioniert. Ich habe stattdessen getHeaderView (0) verwendet.
Zeezer
6
Diese Lösung funktioniert nicht richtig. Dies zeigt den Header zweimal. Die Verwendung von getHeaderView (0) funktioniert.
AlphaDeveloper
1
@BereketGobeze hat die richtige Antwort, dies funktioniert nicht richtig
touchofsarcasm
Wenn Sie die nächste Zeile aus der XML-Datei entfernen, funktioniert diese Lösung auch einwandfrei: headerLayout = "@ layout / nav_header_main"
Pablo Insua
7

Hier ist die Kotlin-Version des Codes. Ich hoffe, sie hilft jemandem da draußen.

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()
Siyabonga Dube
quelle
6

Sie können dies auch ab 23.1.1 Design Support Library verwenden

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

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

Neri
quelle
3
  1. Sie müssen die NavigationView-ID in Ihrer Aktivität wie folgt erhalten

    NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView );
    
  2. Rufen Sie nun das HeaderView-Layout mit der folgenden Navigationsansichts-ID ab

    View headerView = navigationView.getHeaderView(0);
    
  3. Jetzt können Sie eine beliebige Ansichts-ID abrufen und die gewünschte Aktion ausführen

    TextView navUsername = (TextView) headerView.findViewById(R.id.navUsername);
    navUsername.setText("Your Text Here");
    
WISSEN GURU
quelle
Arbeitete heute für mich
Arsalan Fakhar
0

Verwenden Sie diese Option, um den Navigationsheader abzurufen

View hview = navigationView.getHeaderView(0);

Verwenden Sie dann die hview, um die verschiedenen Ansichten des Navigationsheaders abzurufen und zu tun, was Sie wollen

Andernfalls navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main); wird bei Index 1 ein neuer Header erstellt.

Sachin Gupta
quelle
0

Zunächst müssen wir die Instanz der Navigationsansicht abrufen, indem wir die Navigationsansicht in einer Ansichtsvariablen aufblasen. Später können Sie die textView-Instanz dazu bringen, die Textansicht zu bearbeiten

G-tt Abhishek
quelle
0

Was hat bei mir funktioniert? Es ist das:-

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

Denken Sie jedoch daran, dies aus Ihrer XML-Datei zu entfernen, dh aus NavigationView: -app:headerLayout="@layout/nav_header_main"


Ok, abgesehen von dieser obigen Antwort. Über Monate hinweg dachte ich mir, dass es einen besseren Weg gibt, dies zu tun, wenn Sie in der Android-Entwicklung weit genug fortgeschritten sind. Legen Sie einfach das Frame-Layout dort ab und laden Sie ein Fragment hinein, in dem sich Recyclerview und der Header-Bereich befinden. Mit Recyclerview Sie können den Header mit Textansichten, Bildern und vielem mehr nach Ihren Wünschen einrichten. Die aktuelle Anwendung, an der ich arbeite, hat genau das getan. Dynamisch übergebene Daten aus Fragmentaktivität ohne Symbole an Recyclerview übergeben und außerdem ein relatives Layout (in Textansichten und Bildansichten) eingefügt, das als Kopfzeile über Recyclerview fungiert.

Debasish Ghosh
quelle
0

Das hat bei mir funktioniert:

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);
Faisal Shaikh
quelle
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")
Soumen Das
quelle
-1

Ich habe das gleiche Problem, aber beide gegebenen Lösungen haben bei mir nicht funktioniert

java.lang.IllegalStateException: Erforderliche Ansicht 'nav_header_username' mit der ID 2131296646 für das Feld 'username' wurde nicht gefunden. Wenn diese Ansicht optional ist, fügen Sie die Annotation '@Nullable' (Felder) oder '@Optional' (Methoden) hinzu.

Ich habe fast den gleichen Code wie oben angegeben:

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());
Aman Bhatia
quelle
Das beantwortet die Frage des OP nicht
Nikolai Shevchenko