【问题标题】:Android dataBinding - How to get resource id of a View in xmlAndroid dataBinding - 如何在 xml 中获取视图的资源 id
【发布时间】:2016-01-16 19:59:16
【问题描述】:

在 Android Studio 中,我的数据绑定本身可以正常工作并且设置良好。我有一个这样定义的布尔值:

<resources>
    <bool name="showAds">false</bool>
</resources>

在 layout.xml 文件中我想引用这个布尔值(它工作正常),但我想根据这个布尔值分配一个 id。让我向您展示我要完成的工作:

我有一个在 relativeLayout 标记中的按钮,根据这个布尔值,我想重新定位按钮。所以我有这个:

<Button
   android:id="@+id/startButton"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:textSize="64dip"
   ****************
   android:layout_below="@{@bool/showAds ? @+id/adone : @+id/title_main}"
   ****************
   android:layout_centerHorizontal="true"
   android:textColor="#0080FF"
   android:text="@string/start_btn_title" />

看看我想做什么?如果 showAds 布尔值为真,我想将按钮布局在名为 adone 的布局下方,否则将其放在名为 title_main 的布局下方。这是什么语法,因为我在这里没有编译。我得到一个编译错误:

第二个@符号之后的表达式

【问题讨论】:

  • 尝试从两个选项中删除+ 符号,给你@{@bool/showAds ? @+id/adone : @+id/title_main},看看是否有效。您需要在实际视图本身的 ID 上添加 + 符号。
  • 感谢您的帮助,实际上developer.android.com/reference/android/widget/… 说我需要“+ 号”,但我还是删除了它,然后我收到“错误:(119, 33) 找不到设置器参数类型为 int 的属性 'android:layout_below'。”所以看起来它把它看作一个 int 。顺便说一句,应用你的 cmets 后它看起来像这样: android:layout_below="@{@bool/showAds ? @id/adone : @id/title_main}"
  • 某处需要+,最好是在ID 的第一次出现时。我的猜测是数据绑定表达式语言无法处理定义新 ID,这就是为什么删除 + 会让您前进。下一个测试:@{@id/adone}。如果编译成功(尽管它不会给你想要的东西),那么三元运算符不知何故失去了这些是 ID 资源的事实。如果这不能编译,那么它可能与RelativeLayout.LayoutParams 属性有关。
  • 我可以在没有 elvis 运算符的情况下执行 if 条件吗? “下一个测试”也不起作用。当我这样做时,它无法将其识别为表达式。
  • 那么我认为问题不在于操作员,而在于layout_below,但这只是我有根据的猜测。

标签: android data-binding


【解决方案1】:

上面是和How to get dimensions from dimens.xml一样的问题

LayoutParams 属性都没有内置支持。正如链接文章中所回答的,LayoutParams 的数据绑定被认为太容易被滥用,因此它被排除在内置的BindingAdapters 之外。你没有滥用它,所以你应该添加你自己的。

@BindingAdapter("android:layout_below")
public static void setLayoutBelow(View view, int oldTargetId, int newTargetId) {
    RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)
        view.getLayoutParams();
    if (oldTargetId != 0) {
        // remove the previous rule
        layoutParams.removeRule(RelativeLayout.BELOW);
    }
    if (newTargetId != 0) {
        // add new rule
        layoutParams.addRule(RelativeLayout.BELOW, newTargetId);
    }
    view.setLayoutParams(layoutParams);
}

顺便说一句,绑定语法中的@+id/adone 不会创建id。您应该在要绑定的视图中创建 id。

【讨论】:

    猜你喜欢
    • 2020-04-02
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多