web-dev-qa-db-ja.com

ナビゲーションドロワーヘッダーのTextViewのテキストを変更する方法

ナビゲーションドロワーヘッダー内の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");    
}

これどうやってするの?

65
Salar Rastari

NavigationViewで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");
199
Bereket Gobeze

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

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

23.1.1設計サポートライブラリの時点でこれを使用することもできます

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

参照: https://stackoverflow.com/a/33692431/276192

6
Neri

コードの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
Siyabonga Dube

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

0
Gd Abhishek
  1. このようなアクティビティでNavigationView idを取得する必要があります

    NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView );
    
  2. このようにNavigationview IDを使用してHeaderView Layoutを取得します

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

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

私にとって何がうまくいきましたか?そのこれ:-

 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など、好きなようにヘッダーを設定できます。私が取り組んでいる最近のアプリケーションはそれをやっただけで、断片的なアクティビティからデータをRecyclerviewに動的にアイコンなしで渡し、Recyclerviewの上にヘッダーとして機能する相対的なレイアウト(textviewsとimageviewの内部)を配置しました。

0
Debasish Ghosh

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

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

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

View hview = navigationView.getHeaderView(0);

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

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

0
Sachin Gupta