web-dev-qa-db-fra.com

Comment changer le texte d'un TextView dans l'en-tête du tiroir de navigation?

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?

50
Salar Rastari

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");
165
Bereket Gobeze

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

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

6
Neri

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()
3
Siyabonga Dube

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

0
Gd Abhishek
  1. Vous devez obtenir un identifiant NavigationView dans votre activité comme ceci

    NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView );
    
  2. Maintenant, obtenez HeaderView Layout en utilisant l'identifiant Navigationview comme ceci

    View headerView = navigationView.getHeaderView(0);
    
  3. 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");
    
0
KNOWLEDGE GURU

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. 

0
Debasish Ghosh

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);
0
Faisal Shaikh