Chcę zmienić tekst TextView w nagłówku szuflady nawigacji. Ale pojawia się ten błąd:
java.lang.NullPointerException: Próba wywołania metody wirtualnej „void android.widget.TextView.setText (java.lang.CharSequence)” na odwołaniu do obiektu o wartości null
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");
}
Jak mogę to zrobić?
TextView
w nagłówku szuflady nawigacji, użyj tego kodu wActionBarDrawerToggle.onDrawerOpened()
metodzie. Zobacz: stackoverflow.com/a/35952939/1657502 .Najpierw należy wypełnić układ nagłówka z NavigationView ...
navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main); tvHeaderName= (TextView) navHeaderView.findViewById(R.id.tvHeaderName); tvHeaderName.setText("Saly");
źródło
Oto wersja kodu Kotlin, mam nadzieję, że komuś tam pomoże.
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()
źródło
Możesz również użyć tej biblioteki od 23.1.1 do obsługi projektów
View header = navigationView.getHeaderView(0) TextView text = (TextView) header.findViewById(R.id.textView);
Źródła: https://stackoverflow.com/a/33692431/2761923
źródło
Musisz uzyskać identyfikator NavigationView w swojej aktywności w ten sposób
Teraz pobierz układ HeaderView przy użyciu identyfikatora Navigationview w ten sposób
View headerView = navigationView.getHeaderView(0);
Teraz możesz uzyskać dowolny identyfikator widoku i wykonać akcję, co chcesz, na przykład
TextView navUsername = (TextView) headerView.findViewById(R.id.navUsername); navUsername.setText("Your Text Here");
źródło
Użyj tego, aby uzyskać nagłówek nawigacji
View hview = navigationView.getHeaderView(0);
następnie użyj hview, aby uzyskać różne widoki nagłówka nawigacji i zrób, co chcesz
w innym przypadku użycie
navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main);
tego to utworzenie nowego nagłówka pod indeksem 1.źródło
Przede wszystkim musimy uzyskać wystąpienie widoku nawigacji poprzez zawyżenie widoku nawigacji w zmiennej widoku, później można uzyskać instancję textView, aby edytować widok tekstu
źródło
Co mi pomogło? to jest to:-
Ale pamiętaj, aby usunąć to z pliku xml, tj. Z NavigationView: -
app:headerLayout="@layout/nav_header_main"
Ok poza powyższą odpowiedzią… przez kilka miesięcy doszedłem do wniosku, że jest lepszy sposób na zrobienie tego, jeśli jesteś wystarczająco zaawansowany w programowaniu na Androida! Po prostu umieść tam układ ramki i załaduj do niego fragment, w którym mamy Recyclerview i sekcję nagłówka. Z Recyclerview Możesz skonfigurować nagłówek, jak chcesz, z podglądami tekstu, obrazami i wieloma innymi, jak chcesz. Niedawna aplikacja, nad którą pracuję, właśnie to zrobiła. Dynamicznie przekazywała dane do Recyclerview z fragmentaryczności bez ikon, a także umieszczała względny układ (wewnątrz widoków tekstowych i widoku obrazu), który działa jako nagłówek na górze Recyclerview.
źródło
To zadziałało dla mnie:
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);
źródło
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")
źródło
Mam ten sam problem, ale oba podane rozwiązania nie zadziałały
Mam prawie taki sam kod jak zamieszczony powyżej:
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());
źródło