【问题标题】:Android databinding set alignParentTopAndroid数据绑定设置alignParentTop
【发布时间】:2015-12-08 15:57:24
【问题描述】:

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

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

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

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

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

但是在尝试编译时,android studio 会说:

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

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

【问题讨论】:

  • 可以区分大小写吗?你试过用小写 B 的boolean 吗?
  • @McAdam331 我刚刚用boolean试过了,还是不行,错误是一样的

标签: android android-databinding


【解决方案1】:

我不得不对此进行深入研究,并在 Google 代码中找到了 recent issue

引用一位项目成员的话:

我们明确不支持布局属性的数据绑定, 尽管您可以在技术上自己添加它们。问题是 这些很容易被试图制作动画的人滥用。

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

@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);
}

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

【讨论】:

  • 我通过@BindingAdapter 实现了它,但希望有更优雅的方式。还是谢谢!
  • @Arkadiy 很高兴为您提供帮助!我很高兴我的第 500 个答案很好,哈哈。抱歉,没有其他方法,但至少现在您确定没有其他方法。
  • 只是给未来读者的提示:此代码以及@BindingAdapter 的任何其他实例都可以放在您喜欢的任何类中(例如新创建的BindingAdapters.java)。然后它将在数据绑定过程中被识别,并允许编译继续进行,而不会出现问题中提到的错误。
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2017-07-05
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    相关资源
    最近更新 更多