自定义控件,使用XML属性进行数据绑定时无效。

3
我已经在我的自定义控件中设置了自定义属性,就像这样:

<declare-styleable name="MyControl" tools:ignore="ResourceName">
    <attr name="ms_hide_arrow" format="boolean"/>
</declare-styleable>

然后,我的控件被用在我的应用程序xml布局中,这个可以工作:

 <MyControl
  .................
  app:ms_hide_arrow="false"
/>

但如果我尝试使用数据绑定来提供值,就像这样:

 <MyControl
  .................
  app:ms_hide_arrow="@{user.hideArrow}"
/>

我收到了错误信息:

Error:(183, 34) 找不到参数类型为布尔值的属性'app:ms_hide_arrow'的setter方法...

我错过了什么吗?如果我使用标准的Android控件,例如标准的spinner,我可以使用数据绑定设置其属性而没有任何问题。

我需要做些什么才能使我的自定义控件能够与数据绑定一起使用呢?

[添加] 通过像这样添加setter方法解决了此问题:

public void setMs_hide_arrow(boolean v)
{
  hideArrow = v;
}

然而,当我尝试使用双向绑定时仍然存在问题,所以在xml中我设置了:

app:ms_hide_arrow="@={user.hideArrow}"

最后的getter方法:

public boolean getMs_hide_arrow()
{
   return hideArrow ;
}

我收到一个有关缺少getter的错误信息:

错误:(171,9)找不到属性'app:ms_hide_arrow'的获取器,其值类型为布尔,在...上

获取器已经存在了,怎么回事?


1
MyControl中的 setMsHideArrow(boolean) 方法是什么? - pskink
还是有些问题。我尝试了双向绑定,但它抱怨缺少getter,即使getter已经存在。有什么想法吗? - user1209216
与之前相同,找不到getter。但是getter确实存在。 - user1209216
是的。但是需要使用驼峰命名法,与setter相同的语法,对应属性名称。我还测试了其他属性,没有任何驼峰命名法(为了确保),始终忽略2向绑定的getter。我很困惑。只有使用setter的1向绑定正常工作。 - user1209216
请点击此处查看相关的编程内容:https://android.googlesource.com/platform/frameworks/data-binding/+/master/extensions/baseAdapters/src/main/java/android/databinding/adapters/TextViewBindingAdapter.java#78 - pskink
显示剩余10条评论
1个回答

1

例如,在您的视图模型中创建绑定适配器(您可以为所有绑定适配器创建一个类):

@BindingAdapter("msHideArrow")
public static void hideArrow(View View, boolean isVisible) {
    if (isVisible) {
        view.setVisibility(View.VISIBLE);
    } else {
        view.setVisibility(View.INVISIBLE);
    }
}

在你的 XML 文件中:
 <MyControl
  .................
  app:msHideArrow="@{user.hideArrow}"
/>

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