Android DataBinding访问HashMap取值设置Toolbar标题不生效是为什么?
问题原因
这种通过DataBinding访问HashMap取值的用法本身是合法支持的,Toolbar不显示标题通常是以下几个原因导致:
- 布局变量未赋值:仅在布局文件中声明
variable标签不会自动生成实例,你需要在Activity/Fragment的代码中手动为DataBinding实例传入你的UtilsClass对象,否则布局中引用的string变量为空,调用方法自然返回空值。 - HashMap键类型不匹配:你在布局中调用
get(9167)传入的是int类型的键,如果你的UtilsClass中HashMap的键类型为String(比如键存的是字符串"9167"),类型不匹配会导致get方法返回null,无内容显示。 - 无观察能力导致更新失效:如果你的HashMap是在DataBinding绑定完成之后才填充的内容,普通HashMap没有数据变化通知能力,DataBinding监听不到内容变更,就不会主动更新UI。
- 类路径配置错误:如果
variable标签中type属性填写的UtilsClass路径不全或者错误,会导致DataBinding绑定失败,变量无法正常引用。
解决方法
- 首先确认你在代码中完成了变量赋值,示例如下:
// Kotlin 示例 val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main) // 手动传入UtilsClass实例,必须添加该行 binding.string = utilsClassInstance
// Java 示例 ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main); // 手动传入UtilsClass实例,必须添加该行 binding.setString(utilsClassInstance);
- 检查HashMap键的类型,和布局中传入的参数保持一致,例如键为String类型时,布局写法调整为:
app:title="@{string.strings.get(`9167`)}"
- 如果HashMap数据是动态填充的,将普通HashMap替换为
ObservableHashMap实现数据变化监听:
// UtilsClass中的定义调整 public ObservableHashMap<Integer, String> strings = new ObservableHashMap<>();
- 可以添加空值兜底逻辑,方便排查问题:
app:title="@{string.strings.get(9167) ?? `加载失败`}"
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

