29

今まで問題なくv23.0.1サポート ライブラリを使用してきました。新しいv23.1.0ライブラリに切り替えると、ドロワー レイアウトのウィジェットに null ポインターが表示されます。

mNavigationView = (NavigationView) findViewById(R.id.navigation_view);    
TextView username = (TextView) mNavigationView.findViewById(R.id.username_textView);
//       ^^^^^^^^ is now null when using new library
// which causes the following to fail
username.setText(mUser.getName());

活動のレイアウト

<?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"
    tools:context=".MainActivity">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include layout="@layout/toolbar" />

    ...

</LinearLayout>

<android.support.design.widget.NavigationView
    android:id="@+id/navigation_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/drawer_header"
    app:menu="@menu/drawer_items" />

</android.support.v4.widget.DrawerLayout>

drawer_header.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="150dp"
android:orientation="vertical">

   <TextView
    android:id="@+id/username_textView"
    android:layout_width="match_parent"
    android:layout_height="0dp" />

    ...

</LinearLayout>

古いバージョンを使用するようにgradleファイルを変更するだけで、すぐに正常に動作するようになるため、コードにひどく問題があるとは思いません. アップデートのリビジョンをチェックアウトしましたが、これを引き起こすと思われるものは何も見つかりませんでした。

確かにこれは他の人にも影響を与えるでしょう、何か手がかりはありますか?

4

5 に答える 5

41

デザイン ライブラリv 23.1.0ではNavigationViewRecyclerView.
また、Header行のタイプになりました。

これは、ビュー階層でヘッダーをすぐに使用できないことを意味します。ヘッダー内のビューを取得する
ような方法を使用している場合、問題が発生する可能性があります。navigationView.findViewById(XXX)

Google トラッカーにバグがあります。

編集 12/10/2015: デザイン ライブラリ 23.1.1

23.1.1 では、getHeaderView()を使用して NavigationView のヘッダー ビューを取得するための新しい API が導入されています。

23.1.1 より前

回避策 fot 23.1.0を使用することができますaddOnLayoutChangeListener。次のようなもの:

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

        View view = navigationView.findViewById( ... );
    }
} );

別の可能な回避策は次のとおりです。

  • xml から属性を削除し、app:headerLayoutプログラムでヘッダーを追加します。

  • プログラムで headerView をインフレートします。

次のようなものを使用します。

View headerLayout = navigationView.inflateHeaderView(R.layout.navigation_header);
headerLayout.findViewById(xxx);
于 2015-10-16T05:42:54.553 に答える
11

xml を使用してヘッダー ビューをナビゲーション ドロワーにアタッチすると、現在壊れているようです。解決策は、ビューを手動で膨張させてアタッチすることです。

活動のレイアウト

<android.support.design.widget.NavigationView
    android:id="@+id/navigation_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:headerLayout="@layout/drawer_header" <!-- remove this line -->
    app:menu="@menu/drawer_items" />

次に、コードで次のようにヘッダーをインフレートしてアタッチします。

NavigationView navigationView = (NavigationView) findViewById(R.id.navigation_view);
View drawerHeader = navigationView.inflateHeaderView(R.layout.drawer_header);

TextView username = (TextView) drawerHeader.findViewById(R.id.username_textView);
于 2015-10-16T03:07:18.530 に答える
0

これは 23.1.0 のバグです

23.1.1 修正

https://plus.google.com/+AndroidDevelopers/posts/ebXLByBiEBU

于 2015-11-13T02:18:34.577 に答える
0

Android SDK マネージャーからビルド ツールを更新したところ、23.1.0 も問題なく動作しています。

私は使っている

buildToolsVersion "23.0.2"

これより前は 23.0.1 でした。

使用する必要はありません

(View)navigationView.findViewById(R.id.idOfViewFromHeaderView);

あなたの活動では、直接使用することができます

(View)findViewById(R.id.idOfViewFromHeaderView);
于 2016-01-04T16:55:10.700 に答える
0

新しいNavigationViewヘッダーは行タイプにRecyclerView なりました。あなたまたは誰かがそれを見つけられるようにするにはview、回避策を講じてリスナーをid使用する必要があります。それから、どこかに文書化する必要があることはわかっていますが、Android は meh のようになります!. addOnLayoutChangeListenerview

于 2015-10-16T03:21:21.013 に答える