Android数据绑定设置alignParentTop

8
我有以下布局(仅保留相关部分):
<RelativeLayout>
    <View android:layout_alignParentTop="true"/>
</RelativeLayout>

我尝试使用在<data>块中声明的变量设置layout_alignParentTop属性,如下所示:

<data>
    <variable
        name="condition"
        type="Boolean"/>
</data>

<RelativeLayout>
    <View android:layout_alignParentTop="@{condition}"/>
</RelativeLayout>

然而,在尝试编译时,Android Studio会显示以下错误:

错误:找不到参数类型为java.lang.Boolean的属性“android:layout_alignParentTop”的setter。

我该如何使用数据绑定变量设置layout_alignParentTop属性?


它是否区分大小写?你尝试过使用小写字母B的布尔值吗? - AdamMc331
@McAdam331 我刚刚尝试了使用 boolean,但仍然不起作用,错误仍旧相同。 - Mikhail
2个回答

16

我必须对此进行一些挖掘,并在Google Code中找到了最近的问题

引用项目成员之一的话:

虽然您可以在技术上自行添加,但我们明确不支持对布局属性进行数据绑定。问题是,这些属性很容易被滥用,人们试图对其进行动画处理。

要为您的应用程序实现这些内容,请创建一个绑定适配器:

@BindingAdapter("android:layout_width")
public static void setLayoutWidth(View view, int width) {
  LayoutParams layoutParams = view.getLayoutParams();
  layoutParams.width = width;
  view.setLayoutParams(layoutParams);
}
在您的情况下,您只需要稍微调整一下alignParentTop属性即可:
@BindingAdapter("android:layout_alignParentTop")
public static void setAlignParentTop(View view, boolean alignParentTop) {
   RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
      RelativeLayout.LayoutParams.WRAP_CONTENT,
      RelativeLayout.LayoutParams.WRAP_CONTENT);

   if(alignParentTop) {
      layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
   }

   view.setLayoutParams(layoutParams);
}

这还没有经过测试,但应该足以让你朝着正确的方向前进。


1
我通过 @BindingAdapter 实现了它,但仍希望有更优雅的方式。无论如何,谢谢! - Mikhail
@Arkadiy 很高兴能帮忙!我很高兴我的第500个答案是一个好答案哈哈。很抱歉没有其他方法,但至少现在你确定没有其他方法了。 - AdamMc331
仅供未来读者参考:此代码以及任何其他 @BindingAdapter 实例都可以放置在您喜欢的任何类中(例如新创建的 BindingAdapters.java)。然后,在数据绑定过程中将被识别,并允许编译进行,而不会出现像问题中提到的错误。 - Dev-iL

2
@BindingAdapter("android:layout_alignParentLeft")
public static void setAlignParentLeft(View view, boolean alignParentLeft) {
    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
            view.getLayoutParams()
    );

    if (alignParentLeft) {
        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
    }

    view.setLayoutParams(layoutParams);
}

这段代码更通用,不会为每个视图应用wrap_content。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接