关于NavigationView的一点问题

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"

这句话去掉,结果就是我们想要的,当然同时也可以响应图片的点击事件了。如果大家有什么更好的建议,欢迎提出。

你可能感兴趣的:(android)