it-swarm.com.de

Wie kann ich den Text eines TextView in der Kopfzeile der Navigationsleiste ändern?

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

Java.lang.NullPointerException: Versuch, die virtuelle Methode 'void .__' aufzurufen. Android.widget.TextView.setText (Java.lang.CharSequence) 'auf einem Nullwert Objektreferenz


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?

50
Salar Rastari

Verwenden Sie getHeaderView` für Ihre 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");
165
Bereket Gobeze

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"); 
8
Ashutosh Verma

Sie können diese ab 23.1.1 auch als Design-Support-Bibliothek verwenden

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

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

6
Neri

Hier ist die Kotlin-Version des Codes, ich hoffe, es 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()
3
Siyabonga Dube

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

0
Gd Abhishek
  1. Sie müssen die NavigationView-ID wie folgt in Ihre Aktivität aufnehmen

    NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView );
    
  2. Holen Sie sich jetzt HeaderView Layout mithilfe der Navigationsansicht id

    View headerView = navigationView.getHeaderView(0);
    
  3. Jetzt können Sie eine beliebige Ansichts-ID abrufen und eine Aktion ausführen, die Sie als Beispiel verwenden möchten

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

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, d. H. Aus der Navigationsansicht: -app:headerLayout="@layout/nav_header_main"


Ok, abgesehen von dieser Antwort ... über Monate hinweg habe ich mir gedacht, dass es eine bessere Methode ist, wenn Sie in der Android-Entwicklung weit genug fortgeschritten sind! Setzen Sie einfach das Rahmenlayout dorthin und laden Sie ein Fragment darin. Mit Recyclerview können Sie die Kopfzeile nach Belieben mit Textansichten, Bildern und vielem mehr einrichten. Die aktuelle Anwendung, an der ich gerade arbeite, hat genau das getan. Dynamisch übermittelte Daten aus Fragmentaktivität ohne Symbole und legte ein relatives Layout (innerhalb von Textansichten und Bildansicht) vor, das als Kopfzeile über Recyclerview fungiert. 

0
Debasish Ghosh

Das hat für mich 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);
0
Faisal Shaikh

Verwenden Sie diese Option, um den Navigationsheader abzurufen

View hview = navigationView.getHeaderView(0);

verwenden Sie dann die Ansicht hview, um die verschiedenen Ansichten des Navigationsheaders abzurufen und die gewünschten Aktionen auszuführen

andernfalls wird mit navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main); ein neuer Header am Index 1 erstellt.

0
Sachin Gupta