ナビゲーションドロワーヘッダーのTextViewのテキストを変更するにはどうすればよいですか?


84

ナビゲーションドロワーヘッダー内のTextViewのテキストを変更したい。しかし、私はこのエラーを受け取ります:

java.lang.NullPointerException:nullオブジェクト参照で仮想メソッド 'void android.widget.TextView.setText(java.lang.CharSequence)'を呼び出そうとしました


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");    
}

これどうやってするの?

回答:


267

ナビゲーションビューでgetHeaderView`を使用します

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

3
TextViewナビゲーションドロワーヘッダーのを確実に更新するには、ActionBarDrawerToggle.onDrawerOpened()メソッドでこのコードを使用します。参照:stackoverflow.com/a/35952939/1657502
アントニオビニシウスメネゼスメデイ2018

セーバーメイト。神はあなたを祝福します:D
Biswajit Das

9

最初にNavigationViewからヘッダーレイアウトを膨らませる必要があります...

navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main);
tvHeaderName= (TextView) navHeaderView.findViewById(R.id.tvHeaderName);
tvHeaderName.setText("Saly"); 

3
私にとって、inflateHeaderViewは機能しませんでした。代わりにgetHeaderView(0)を使用しました。
Zeezer 2016年

6
このソリューションは正しく機能しません。これはヘッダーを2回表示します。getHeaderView(0)の使用は機能します。
alphaDeveloper 2016

1
@BereketGobezeには正解がありますが、これは正しく機能しません
touchofsarcasm 2017年

あなたはXMLファイルから次の行を削除する場合は、このソリューションは、罰金のアプリを動作します:headerLayoutを=「@レイアウト/ nav_header_main」
パブロ・インスア

7

これがKotlinバージョンのコードです。誰かの助けになることを願っています。

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
  1. このようにアクティビティでNavigationViewIDを取得する必要があります

    NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView );
    
  2. このようなNavigationviewIDを使用してHeaderViewレイアウトを取得します

    View headerView = navigationView.getHeaderView(0);
    
  3. これで、任意のビューIDを取得して、必要なアクションを実行できます。

    TextView navUsername = (TextView) headerView.findViewById(R.id.navUsername);
    navUsername.setText("Your Text Here");
    

今日私のために働いた
Arsalan Fakhar

0

これを使用してナビゲーションヘッダーを取得します

View hview = navigationView.getHeaderView(0);

次に、hviewを使用して、ナビゲーションヘッダーのさまざまなビューを取得し、必要な操作を実行します

それ以外の場合、navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main); これを使用すると、インデックス1に新しいヘッダーが作成されます。


0

最初に、ビュー変数でナビゲーションビューを膨らませて、ナビゲーションビューのインスタンスを取得する必要があります。後で、textViewインスタンスを取得してtextviewを編集できます。


0

何が私のために働いたのですか?そのこれ:-

 View linearLayout=navigationView.inflateHeaderView(R.layout.nav_header_main);
      TextView name =  linearLayout.findViewById(R.id.welcomenametext);

ただし、これをxmlファイル、つまりNavigationViewから削除することを忘れないでください:-app:headerLayout="@layout/nav_header_main"


上記の回答とは別に、Androidの開発が十分に進んでいる場合は、数か月にわたってより良い方法があると思いました!!フレームレイアウトをそこに配置し、Recyclerviewとヘッダーセクションがあるフラグメントをロードするだけです。Recyclerviewを使用すると、textviews、image、その他多くのヘッダーを好きなように設定できます。私が取り組んでいる最近のアプリケーションはまさにそれを行いました。アイコンなしのfragmentactivityからRecyclerviewにデータを動的に渡し、Recyclerviewの上にヘッダーとして機能する相対レイアウト(textviewsとimageview内)を配置しました。


0

これは私のために働いた:

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

-1

私は同じ問題を抱えていますが、与えられた両方の解決策は私にとってはうまくいきませんでした

java.lang.IllegalStateException:フィールド「username」のID2131296646の必須ビュー「nav_header_username」が見つかりませんでした。このビューがオプションの場合は、「@ Nullable」(フィールド)または「@Optional」(メソッド)アノテーションを追加します。

私は上記に投稿したものとほぼ同じコードを持っています:

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());

それはOPの質問に答えません
Nikolai Shevchenko
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.