LoginSignup
10
9

More than 5 years have passed since last update.

Android Design Support library 23.1.0でNavigationViewのヘッダー内Viewが取得できない

Last updated at Posted at 2015-10-16

Android Design Support library 23.1.1 追記

Android Design Support library 23.1.1ではNavigationViewも更新されています。
ヘッダーを

View headerView = navigationView.getHeaderView(0);

のように取得出来るため、下記の例であれば

MainActivity.java
View headerView = navigationView.getHeaderView(0);
ImageView header = (ImageView)headerView.findViewById(R.id.header_image);

とすることでヘッダー内のViewを扱うことが出来ます。

以下は23.1.0の頃の古い情報になります。

例えば、

activity_main.xml
<android.support.design.widget.NavigationView
        android:id="@+id/navi_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/header"
        app:menu="@menu/menu_main" />
header.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:background="@color/primaryColor">

    <ImageView
        android:id="@+id/header_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</FrameLayout>

のようなレイアウトの場合、コード上で

MainActivity.java
ImageView header = (ImageView)findViewById(R.id.header_image);

といった形で平易にViewを取得出来たのですが、23.1.0ではこれがnullとなり取得出来なくなりました……。
調べると既に報告がありましたが、現状の対応策としては下記のようにNavigationViewのリスナーで取得するほかないようです。

navigationView.addOnLayoutChangeListener( new View.OnLayoutChangeListener()
{
   @Override
   public void onLayoutChange( ... )
   {
       navigationView.removeOnLayoutChangeListener( this );

       View view = navigationView.findViewById( ... );
   }
} );
10
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9