ナビゲーションドロワーヘッダー内の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");
}
これどうやってするの?
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");
最初にNavigationViewからヘッダーレイアウトを膨らませる必要があります...
navHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main);
tvHeaderName= (TextView) navHeaderView.findViewById(R.id.tvHeaderName);
tvHeaderName.setText("Saly");
23.1.1設計サポートライブラリの時点でこれを使用することもできます
View header = navigationView.getHeaderView(0)
TextView text = (TextView) header.findViewById(R.id.textView);
コードの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()
最初に、ビュー変数でナビゲーションビューを拡張してナビゲーションビューのインスタンスを取得する必要があります。後で、textViewインスタンスを取得してtextviewを編集できます
このようなアクティビティでNavigationView idを取得する必要があります
NavigationView navigationView = (NavigationView) findViewById(R.id.navigationView );
このようにNavigationview IDを使用してHeaderView Layoutを取得します
View headerView = navigationView.getHeaderView(0);
これで、任意のビューIDを取得して、必要なアクションを実行できます。
TextView navUsername = (TextView) headerView.findViewById(R.id.navUsername);
navUsername.setText("Your Text Here");
私にとって何がうまくいきましたか?そのこれ:-
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の内部)を配置しました。
これは私のために働いた:
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);
これを使用してナビゲーションヘッダーを取得します
View hview = navigationView.getHeaderView(0);
次に、hviewを使用してナビゲーションヘッダーのさまざまなビューを取得し、必要な操作を行います。
それ以外の場合はnavHeaderView= navigationView.inflateHeaderView(R.layout.nav_header_main);
を使用して、インデックス1に新しいヘッダーを作成しています。