NavigationView 是抽屉式菜单中经常使用的View,在使用自带的NavigationView 时遇到了一些问题:
在主布局文件中,设置NavigationView如下:
<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" />
在 headerLayout 的布局xml中如下写了一个ImageView:
<ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
然后在Activity 中直接使用 ImageView image = (ImageView)findViewById(R.id.img),运行之后一直报
NullPointerException,一开始以为是其它地方,找了好久,最后通过 Log 发现 获取的 image 是 Null的,接着改成如下代码:
LayoutInflater inflater=(LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
View view= inflater.inflate(R.layout.nav_header_main, null);
user_head_portrait = (ImageView)view.findViewById(R.id.img);
运行之后不会报错,但是通过调用一个处理图片的方法将处理后的 bitmap 通过user_head_portrait.setImageBitmap(bitmap) 并没有显示,更不用提对 imageView 的点击事件了。
重点来了,需要修改成如下:
View view = navigationView.inflateHeaderView(R.layout.nav_header_main);
user_head_portrait = (ImageView)view.findViewById(R.id.img);
user_head_portrait.setImageBitmap(bitmap);
inflateHeaderView 的源码如下,返回的是一个View:
public View inflateHeaderView(@LayoutRes int res) {
return mPresenter.inflateHeaderView(res);
}
依然可以正常运行,不会报 NullPointerException,并且可以显示 imageView,但是headerLayout会显示两次,上面是没有显示图片的布局也就是之前使用LayoutInflater 加载之后的布局,下面是可以成功显示的 带有图片的,此时需要将 xml 文件中的
app:headerLayout="@layout/nav_header_main"
这句话去掉,结果就是我们想要的,当然同时也可以响应图片的点击事件了。如果大家有什么更好的建议,欢迎提出。