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?
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");
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");
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);
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()
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
Sie müssen die NavigationView-ID wie folgt in Ihre Aktivität aufnehmen
NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView );
Holen Sie sich jetzt HeaderView Layout mithilfe der Navigationsansicht id
View headerView = navigationView.getHeaderView(0);
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");
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.
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);
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.