128

在我的NavigationView我有一个标题布局ID为'viewId'与活动按钮。要设置这些按钮,我做活动的​​如下:NavigationView获取/查找标题布局

final View panel = findViewById(R.id.viewId); 
panel.setOnClickListener(new View.OnClickListener() { 
... setup goes here ... 
}); 

随着新版本的Android支持库(23.1.0),视图无法找到,则返回null。与以前的版本,它运作良好。这是一个错误还是我使用这个功能是错误的?如果是这样,如何访问页眉布局并添加行为?

+0

更好的解决方案: http://stackoverflow.com/questions/31241683/are-there-any-way-to -control-view-insde-navigationview-header/33358934#33358934 – GFPF

回答

348

版本23.1.0开关NavigationView改为使用RecyclerView(而不是先前的ListView),并且将标题添加为这些元素之一。这意味着它不能立即致电findViewById() - 在连接到NavigationView之前需要一个布局通行证。

的支持图书馆的version 23.1.1,你现在可以去使用getHeaderView()头视图的引用:

View headerLayout = navigationView.getHeaderView(0); // 0-index header 

这对通过XML,并通过代码添加的报头工作的优势。

如果你还在使用23.1.0,按照the related bug,你可以抬高头的代码,并使用上findViewById()

View headerLayout = 
    navigationView.inflateHeaderView(R.layout.navigation_header); 
panel = headerLayout.findViewById(R.id.viewId); 
// panel won't be null 

直到您移动到23.1.1。

+0

感谢您的及时帮助,将使用解决方法。拥有专门的方法似乎是一种方式,希望在未来的版本中有这种方法。 – khusrav

+0

'OnLayoutChangeListener'需要min sdk等级11,但我的应用中有9个。请任何想法,如何解决方法'findViewById'为'NavigationView'头返回'null'? –

+2

@AlexanderFarber - 我发布的代码回到API 7 – ianhanniballake

7

对我来说那是23.1.0的情况,更新后空指针异常变成了。在这种情况下,NavigatorView看起来像:

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

我试过ianhanniballake的解决方案,但它不起作用。然后我用这句话夸大了:

LayoutInflater.from(getContext()).inflate(R.layout.nav_header, mNavigationView); 

之后,我可以通过id找到在nav_heard中定义的所有视图。

99

现在用23.1.1版本的设计支持库,你可以使用

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

你也可以使用'navigationView.getHeaderCount()',以防万一你有多于一个头部出于任何原因。 –

8

这是我用它和它为我的作品是怎么做。

protected static class HeaderViewHolder { 

    @BindView(R.id.button) 
    Button button; 

    HeaderViewHolder(View view) { 
     ButterKnife.bind(this, view); 
    } 
} 

,然后使用该视图像这样保持器:

View header = navigationView.getHeaderView(0); 
headerViewHolder = new HeaderViewHolder(header); 
在此篇
+1

这是完美的,当你想从你的活动中删除查看相关的逻辑。好想法! – amouly