web-dev-qa-db-fra.com

Android Api 23 Changer la vue de navigation headerLayout textview

Je teste l’exemple de projet Tiroir de navigation sous Android et j’ai un problème pour définir le texte dans l’en-tête du profil de la vue de navigation.

Ceci est mon code:

MainActivity.Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    TextView text = (TextView) findViewById(R.id.textView);
    texto.setText("HELLO");
}

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">

<include layout="@layout/app_bar_main" Android:layout_width="match_parent"
    Android:layout_height="match_parent" />

<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

<?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/side_nav_bar"
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" Android:orientation="vertical"
Android:gravity="bottom">

<ImageView Android:layout_width="wrap_content" Android:layout_height="wrap_content"
    Android:paddingTop="@dimen/nav_header_vertical_spacing"
    Android:src="@Android:drawable/sym_def_app_icon" Android:id="@+id/imageView" />

<TextView Android:layout_width="match_parent" Android:layout_height="wrap_content"
    Android:paddingTop="@dimen/nav_header_vertical_spacing" Android:text="Android Studio"
    Android:textAppearance="@style/TextAppearance.AppCompat.Body1" />

<TextView Android:layout_width="wrap_content" Android:layout_height="wrap_content"
    Android:text="[email protected]" Android:id="@+id/textView" />

</LinearLayout>

Quand j'essaie de définir le texte de textview, j'obtiens toujours cette erreur et cela ne se produit qu'avec le niveau 23 de l'API:

Java.lang.NullPointerException: Attempt to invoke virtual method   'void Android.widget.TextView.setText(Java.lang.CharSequence)' on a null   object reference

Comment puis-je modifier le texte Textview du fichier nav_header_main.xml de l'activité principale?

Merci d'avance

37
user3065901

J'ai eu le même problème et j'ai pu l'éviter avec ce code:

    View header = LayoutInflater.from(this).inflate(R.layout.nav_header_main, null);
    navigationView.addHeaderView(header);
    TextView text = (TextView) header.findViewById(R.id.textView);
    text.setText("HELLO");
45
orium

Maintenant, avec la version 23.1.1 de la bibliothèque de support de conception, vous pouvez utiliser

View header = navigationView.getHeaderView(0)
TextView text = (TextView) header.findViewById(R.id.textView);
54
German

Orium answer fonctionne et cela fonctionnera également.

View header = navigationView.inflateHeaderView(R.layout.nav_header_main);
    TextView text = (TextView) header.findViewById(R.id.textView);
    texto.setText("HELLO");
7
Roni Soreen

cela a résolu le problème pour moi 

    View headerView = navigationView.inflateHeaderView(R.layout.header_view);

    txt_fullname = (TextView) headerView.findViewById(R.id.txt_fullname);
    txt_email = (TextView) headerView.findViewById(R.id.txt_email);
1
Kamlesh Karwande

Ou si vous utilisez cet attribut:

<Android.support.desibn.widget.NavigationView>
    ...
    app:headerLayout="@layout/your_header_layout"/>

Vous pouvez:

View header = mNavigationView.getHeaderView(0);
TextView title = (TextView) header.findViewById(R.id.your_title_id);
//Or something else
0
TarikW
View headerView=navigationView.getChildAt(0);
TextView tvName=(TextView)hView.findViewById(R.id.name);
TextView tvEmail=(TextView)hView.findViewById(R.id.email);

    tvName.setText(data);
    tvEmail.setText(data);
0
Mahadev Dalavi