如何设置nav_header的用户名与头像?新用户登录设置时遇空指针异常
空指针根因定位
执行navHeaderName.setText(user_name)抛出空指针,本质原因是导航头部布局是独立挂载在NavigationView下的子视图,不属于当前页面根布局的直接视图层级。直接在Activity/Fragment的根布局中调用findViewById()查找导航头内的控件,会因为跨视图层级检索不到对应实例,最终拿到null值引发崩溃。
标准实现流程
- 先从当前页面的根布局中获取NavigationView的实例,注意这里查找的是NavigationView控件本身的id:
NavigationView navigationView = findViewById(R.id.nav_view); - 通过NavigationView内置的方法获取已挂载的导航头视图,单导航头场景下默认取索引为0的头视图:
View navHeaderView = navigationView.getHeaderView(0); - 依托拿到的导航头视图实例,查找头部内的用户名、头像控件,禁止跨层级在根布局中查找:
- 用户名控件:
TextView tvUserName = navHeaderView.findViewById(R.id.nav_header_name); - 头像控件:
ImageView ivUserAvatar = navHeaderView.findViewById(R.id.nav_header_avatar);
- 用户名控件:
- 完成赋值逻辑,此时不会触发空指针:
- 设置用户名文本:
tvUserName.setText(user_name); - 设置头像内容:可结合项目使用的图片加载框架完成加载,例如
Glide.with(this).load(user_avatar_path).circleCrop().into(ivUserAvatar);
- 设置用户名文本:
常见踩坑排查
- 如果是在布局XML中通过
app:headerLayout="@layout/你的导航头布局文件"属性为NavigationView绑定导航头,不需要手动调用inflate()方法加载布局,直接使用getHeaderView(0)即可拿到完整的导航头视图实例 - 若通过代码动态调用
navigationView.inflateHeaderView(R.layout.nav_header)添加导航头,必须等该方法执行完成后再获取头视图、查找内部控件 - 禁止直接在NavigationView实例上调用
findViewById()查找导航头内部的控件,因为NavigationView自身的视图遍历范围不包含独立挂载的头视图节点,必须以导航头的根视图为查找起点
内容的提问来源于stack exchange,提问作者Sulman Rasheed
相关产品推荐
相关产品推荐

