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?
TextView
Verwenden Sie diesen Code in derActionBarDrawerToggle.onDrawerOpened()
Methode , um einen Header in einer Navigationsleiste zuverlässig zu aktualisieren . Siehe: stackoverflow.com/a/35952939/1657502 .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");
quelle
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()
quelle
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
quelle
Sie müssen die NavigationView-ID in Ihrer Aktivität wie folgt erhalten
Rufen Sie nun das HeaderView-Layout mit der folgenden Navigationsansichts-ID ab
View headerView = navigationView.getHeaderView(0);
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");
quelle
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.quelle
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
quelle
Was hat bei mir funktioniert? Es ist das:-
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.
quelle
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);
quelle
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")
quelle
Ich habe das gleiche Problem, aber beide gegebenen Lösungen haben bei mir nicht funktioniert
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());
quelle