Android支持v23.1.0更新中断NavigationView获取/查找标题

我一直在使用v23.0.1支持库,直到现在没有任何问题。 现在,当我切换到新的v23.1.0库时,我得到了抽屉布局中的小部件的空指针。

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文件以使用旧版本,就可以立即正常工作,所以我不认为我的代码有什么可怕的错误。 我检查了更新中的修订版 ,并没有看到任何我认为会导致此问题的内容。

这肯定会影响到别人,任何线索?

Solutions Collecting From Web of "Android支持v23.1.0更新中断NavigationView获取/查找标题"

使用devise库v 23.1.0NavigationViewRecyclerView
此外, Header现在是一种行。

这意味着标题不能立即在视图层次结构中可用
如果您使用像navigationView.findViewById(XXX)这样的方法在页眉内部获取视图,则会导致问题。

Google跟踪器中存在一个错误。

编辑12/10/2015:devise库23.1.1

23.1.1引入了一个新的API来获取NavigationView的标题视图和getHeaderView()

在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。

使用这样的somenthing:

 View headerLayout = navigationView.inflateHeaderView(R.layout.navigation_header); headerLayout.findViewById(xxx); 

它似乎将标题视图附加到使用xml的导航抽屉当前被打破。 解决scheme是充气和手动附加视图。

活动布局

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

在新的NavigationView ,头文件现在是RecyclerView的行types,以便您或任何人通过其id来查找view ,您需要解决它并使用addOnLayoutChangeListener监听器,然后您可以find我知道它应该被logging的view有些地方,但是android就像meh!

我已经更新从Android SDKpipe理器的构build工具,那么23.1.0也适用于我。

我在用

 buildToolsVersion "23.0.2" 

在此之前是23.0.1。

而且不需要使用

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

在你的活动中,你可以直接使用

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