这是一个错误。我们还没有尝试过数据绑定标签,主要是因为标签很特殊。
当定位 ICS 之前的设备时,Android 数据绑定会接管布局最外层元素的标签。该标签主要用于绑定生命周期,并由DataBindingUtil.findBinding()
and DataBindingUtil.getBinding()
.
因此,由于数据绑定不适用于标签,唯一的解决方法是不向 LinearLayout 提供标签或提供固定标签或资源字符串。如果您的目标是 ICS 及以上版本,则在绑定布局后重新分配标签是有效的:
MenuItemBinding binding = MenuItemBinding.inflate(layoutInflater);
binding.getRoot().setTag(menuItem);
您还可以为新属性创建 BindingAdapter:
@BindingAdapter("specialTag")
public static void setSpecialTag(View view, Object value) {
view.setTag(value);
}
然后在您的布局中使用它:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
app:specialTag="@{menuItem}"
tools:ignore="UseCompoundDrawables"/>
这将允许您使用findViewByTag()
以及您期望的所有其他事情。
但是,如果您的目标是 Honeycomb 和更早的设备,则这将不起作用。这是无法回避的。您可能会想做这样的事情:
@BindingAdapter("specialTag")
public static void setSpecialTag(View view, Object value) {
view.setTag(R.id.app_tag, value);
}
您将无法使用findViewByTag
使用这种方法,但是当您使用视图时它会存储您想要的任何值。But我们不使用 Honeycomb 及更早版本的 ID 标签的原因是,有一个内存泄漏使用 ID 标签时,请勿这样做。
我希望这有帮助。我将在内部提交一个错误以支持数据绑定 android:tags。