Android 数据绑定不适用于 View 'android:tag' 属性

2024-02-08

尝试在我的项目中使用新的 Android 数据绑定,但在尝试将“android:tag”属性设置为某个自定义变量时遇到错误。

我的 menu_item.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:tools="http://schemas.android.com/tools"
        xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="menuItem"
            type="com.example.MenuItem" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:tag="@{menuItem}"
        tools:ignore="UseCompoundDrawables">

        <!--suppress AndroidUnknownAttribute -->
        <ImageView
            android:id="@+id/icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:imageResource="@{menuItem.itemType.drawableId}" />

        <TextView
            android:id="@+id/displayName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{menuItem.itemType.displayNameId}" />

    </LinearLayout>
</layout>

我的 MenuItem 类:

public class MenuItem {

    public final ItemType itemType;

    public MenuItem(ItemType itemType) {
        this.itemType = itemType;
    }

}

生成的MenyItemBinding.java的一部分:

public MenuItemBinding(View root) {
        super(root, 0);
        final Object[] bindings = mapBindings(root, 3, sIncludes, sViewsWithIds);
        this.displayName = (android.widget.TextView) bindings[2];
        this.displayName.setTag(null);
        this.icon = (android.widget.ImageView) bindings[1];
        this.icon.setTag(null);
        this.mboundView0 = (android.widget.LinearLayout) bindings[0];
        this.mboundView0.setTag(root.getResources().getString(com.myApp.R.string.@{menuItem}));
        setRootTag(root);
        invalidateAll();
    }

当尝试设置绑定视图的标签时,错误出现在生成的类中。

有什么想法可以解决这个问题吗?最好不要使用自定义 LinearLayout 来支持这一点。


这是一个错误。我们还没有尝试过数据绑定标签,主要是因为标签很特殊。

当定位 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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 数据绑定不适用于 View 'android:tag' 属性 的相关文章

随机推荐

  • 何时实施和扩展? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 什么时候应该implement or extend使用 有哪些现实世界的例子 它是否正确 实施似乎是强制类中存在某些方法并且这些方法函数调用格式
  • 检查委托是否为空

    我正在阅读 Essential C 3 0 一书 想知道这是否是检查委托是否为 null 的好方法 class Thermostat public delegate void TemperatureChangeHandler float n
  • cbind() 正在更改日期格式

    我正在尝试创建数据框的子集 当我这样做时 R 会切换日期列的格式 知道为什么或如何解决这个问题吗 gt head spyPr2 Date Open High Low Close Volume Adj Close 1 12 30 2011 1
  • Julia 中的方法链接

    I read https github com JuliaLang julia issues 5571 https github com JuliaLang julia issues 5571这让我觉得我可以因为一些评论而打破这样的界限 a
  • 无法在 systemd 203/EXEC 中将 Gunicorn 作为服务运行

    我正在尝试使用 Gunicorn WSGI Nginx 部署 FlaskApp 我已经尝试让它工作一段时间了 除了我一直遵循的数字海洋指南之外找不到任何东西 下面是我目前状态下的文件 我尝试了几种不同的调整mywebapp service文
  • 如何在 Chromium 浏览器中创建文本或将文本转换为音频?

    在尝试确定解决方案时如何在 chromium 上使用 Web Speech API https stackoverflow com questions 44013933 how to use web speech api at chromi
  • 对从方法调用的方法进行单元测试

    我有一个角度应用程序和一个在单击时触发的方法 在这个方法中 我将一个值传递给另一个私有方法 ts file public onViewItem item Results void const ids item data id this an
  • SQlite实体框架ADO.net提供程序错误1.0.92.0

    我试图了解 SQlite 和实体框架如何交互 我在 Visual Studio 2013 中创建了一个新的控制台项目 我安装了 SQlite 1 0 92 的 nuget 包 我创建一个新的空模型 edmx 并尝试从静态示例数据库 例如 N
  • opengl物体移动一段距离后振动

    我有一个在地形上移动的物体 第三人称摄像机跟随它 当我将它向不同方向移动一段距离后 即使它没有移动并且摄像机围绕它旋转 它也开始摇晃或振动 这就是移动对象的代码 double delta engine getDeltaTime GLfloa
  • Eclipse 无法启动 (Ubuntu):JVM 终止。退出代码=2

    我安装 ubuntu 14 04 LTS 64位 之后安装 Eclipse Luno Standard for 64bit 安装 Jdk 并使用以下链接按照设置 jdk 的所有步骤进行操作 http www wikihow com Inst
  • 使用 MOXy 和 XPath,是否可以解组两个属性列表?

    请注意 这不是我问的另一个问题的重复 使用 MOXy 和 XPath 是否可以解组属性列表 https stackoverflow com questions 6907225 with moxy and xpath is it possib
  • tf.keras.losses 中“BinaryCrossentropy”和“binary_crossentropy”的区别?

    我正在使用 tf GradientTape 使用 TensorFlow 2 0 训练模型 但我发现该模型的准确性为95 如果我使用tf keras losses BinaryCrossentropy 但降级为75 如果我使用tf keras
  • cURL 错误 60:SSL 证书:无法获取本地颁发者证书

    我尝试使用 Stripe 发送 API 请求 但收到错误消息 cURL 错误 60 SSL 证书问题 无法获取本地颁发者证书 这是我正在运行的代码 public function chargeStripe stripe new Stripe
  • 使用 ExecuteNonQueryAsync 并报告进度

    我以为我正在尝试做一些非常简单的事情 我只想在屏幕上报告一个运行数字 以便用户知道我正在执行的 SQL 存储过程正在工作 并且他们不会不耐烦并开始单击按钮 问题是我无法弄清楚如何实际调用 ExecutNonQueryAsync 命令的进度报
  • Python函数正在改变我输入的值,我不明白为什么

    这是我的第一个问题 所以如果我是一个完全愚蠢的人发布这个 请告诉我为什么以及我将来如何避免它 我有一些 python 代码 应该只需要一个列表 并将第 j 个分量乘以 1 这是有问题的代码 def flip spins j z spins
  • 设计一个可变类,在使用后它变得不可变

    假设该场景不允许实现不可变类型 根据这个假设 我想要关于如何正确设计一种类型的意见 示例 该类型在使用后变得不可变 public class ObjectAConfig private int valueB private string v
  • 在 G.Maps v2 中使用动画 Gif 作为地面叠加层

    我目前正在使用 Google 地图 并且想在我的应用程序中使用动画 Gif 作为叠加层 这真的很令人沮丧 因为它在 iOS 版本的应用程序上看起来很容易 所以我真的很想实现一些很酷的东西 我希望看到的结果是该视频的 23 秒 https w
  • 是否可以将 Clojure 的 case 形式与 Java 枚举一起使用?

    The case医生说 与 cond 和 condp 不同 case 执行常量时间调度 所有常量方式 表达式是可以接受的情况下 我想从中受益case的常量时间调度以匹配 Java 枚举 爪哇的switch语句适用于枚举 但在 Clojure
  • 根据 pandas 中现有列的函数创建新列的动态方法

    我正在寻找一种更具编程性的方法来创建多个新列作为 Pandas DataFrame 中现有列的函数 我有 14 列 Level 2 Level 15 我想迭代地创建 14 个新列 对第 2 15 列 第 3 15 列 第 4 15 列进行求
  • Android 数据绑定不适用于 View 'android:tag' 属性

    尝试在我的项目中使用新的 Android 数据绑定 但在尝试将 android tag 属性设置为某个自定义变量时遇到错误 我的 menu item xml 文件