8

我有以下布局(只剩下相关部分):

<RelativeLayout>
    <View android:layout_alignParentTop="true"/>
</RelativeLayout>

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

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

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

但是,在尝试编译时,android studio 会说以下内容:

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

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

4

2 回答 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);
}

这是未经测试的,但它应该足以让你走上正轨。

于 2015-12-08T16:35:33.433 回答
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

于 2016-12-20T11:01:26.763 回答