Je souhaite modifier le texte d'un TextView dans l'en-tête du tiroir de navigation. Mais je reçois cette erreur:
Java.lang.NullPointerException: tentative d'appeler la méthode virtuelle 'void Android.widget.TextView.setText (Java.lang.CharSequence) 'sur un null référence d'objet
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");
}
Comment puis-je faire ceci?
Utilisez getHeaderView` sur votre navigationView
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");
Vous devez d’abord gonfler votre présentation d’en-tête à partir de NavigationView ...
navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main);
tvHeaderName= (TextView) navHeaderView.findViewById(R.id.tvHeaderName);
tvHeaderName.setText("Saly");
Vous pouvez également l'utiliser à partir de la bibliothèque de support de conception 23.1.1.
View header = navigationView.getHeaderView(0)
TextView text = (TextView) header.findViewById(R.id.textView);
Référence: https://stackoverflow.com/a/33692431/2761923
Voici la version Kotlin du code, j'espère que cela aidera quelqu'un.
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()
Initialement, nous devons obtenir l'instance de la vue de navigation en gonflant la vue de navigation dans une variable de vue, puis vous pouvez obtenir l'occurrence de textView pour modifier la vue du texte
Vous devez obtenir un identifiant NavigationView dans votre activité comme ceci
NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView );
Maintenant, obtenez HeaderView Layout en utilisant l'identifiant Navigationview comme ceci
View headerView = navigationView.getHeaderView(0);
Maintenant, vous pouvez obtenir n'importe quel identifiant de vue et effectuer une action comme vous le souhaitez
TextView navUsername = (TextView) headerView.findViewById(R.id.navUsername);
navUsername.setText("Your Text Here");
Qu'est-ce qui a fonctionné pour moi? c'est ça:-
View linearLayout=navigationView.inflateHeaderView(R.layout.nav_header_main);
TextView name = linearLayout.findViewById(R.id.welcomenametext);
Mais souvenez-vous de supprimer ceci de votre fichier XML i.e de NavigationView: -app:headerLayout="@layout/nav_header_main"
Ok à part cette réponse ci-dessus..au fil des mois, je me suis dit qu'il y avait une meilleure façon de le faire si vous êtes assez avancé dans le développement Android! Il suffit de mettre la disposition du cadre là-bas et de charger le fragment dans celui-ci dans lequel nous avons Recyclerview et la section d'en-tête. Avec Recyclerview Vous pouvez configurer l'en-tête à votre guise avec textviews, images et bien plus encore. L'application récente sur laquelle je travaille vient de le faire. Dynamiquement, les données ont été transférées dans Recyclerview de fragmentactivity avec des icônes externes et ont également mis en page une disposition relative (dans textviews et imageview) qui agit comme en-tête sur Recyclerview.
Cela a fonctionné pour moi:
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);