2016-01-24 13 views
12

Ich möchte den Text einer TextView in der Kopfzeile der Navigationsleiste ändern. Aber ich bekomme diese Fehlermeldung:Wie ändert man den Text eines TextView in der Navigationsleiste?

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference


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 tun?

Antwort

68

Verwenden getHeaderView`on Ihre navigationView

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

Sie sollten Ihre Header-Layout aus NavigationView aufblasen ersten ...

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

Für mich inflateHeaderView hat nicht funktioniert. Ich habe stattdessen getHeaderView (0) verwendet. – Zeezer

+5

Diese Lösung funktioniert nicht ordnungsgemäß. Dies zeigt den Header zweimal an.GetHeaderView (0) funktioniert. – AlphaDeveloper

+1

@BereketGobeze hat die richtige Antwort, das funktioniert nicht richtig – touchofsarcasm

5

Sie können dies auch als von 23.1.1 Design verwenden Support-Bibliothek

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

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

+0

Danke! Einfach und funktionierend. – kosemuckel

0

Was hat bei mir funktioniert? sein dies: -

Aber denken Sie daran von NavigationView dies aus Ihrem XML-Datei, dh zu entfernen: - app:headerLayout="@layout/nav_header_main"


auseinander Ok von diesem über answer..over Monate i dachte, es gibt einen besseren Weg, Wenn Sie in der Android-Entwicklung fortgeschritten genug sind, legen Sie einfach das Rahmenlayout dort hin und laden Sie das Fragment darin, in dem wir Recyclerview und Header-Abschnitt haben. Mit Recyclerview Sie können die Kopfzeile beliebig mit Textansichten, Bildern und vielem mehr einrichten. Die aktuelle Anwendung, an der ich gerade arbeite, hat das gerade getan. Dynamische Daten wurden in Recyclerview von Fragmentactivity ohne Icons übertragen und setzen ein relatives Layout (in Textansichten und Bildansicht), das als Kopfzeile auf Recyclerview fungiert.

0

Damit wird die Navigation Header

View hview = navigationView.getHeaderView(0);

dann mit dem hview bekommen die verschiedenen Ansichten der Navigation Header zu erhalten und tun, was Sie

sonst mit navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main); wollen dies einen neuen Header zu schaffen bei Index 1.

0

In der Regel müssen wir die Instanz der Navigationsansicht durch Aufblasen der Navigationsansicht in einer Ansicht varible erhalten, später können Sie die textView-Instanz auf e setzen dit die Textansicht

Verwandte Themen