【问题标题】:CustomControl, xml attributes not working with data bindingCustomControl,xml 属性不适用于数据绑定
【发布时间】:2017-12-13 11:46:10
【问题描述】:

我在自定义控件中设置了自定义属性,如下所示:

<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}"
/>

我收到错误消息:

错误:(183, 34) 找不到属性的设置器 'app:ms_hide_arrow' 参数类型为 boolean on...

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

我应该做一些具体的事情来让我的自定义控件能够与数据绑定一起使用吗?

[添加] 通过添加这样的设置器解决了问题:

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

但是,当我尝试使用 2-way binding 时仍然存在问题,所以我在 xml 中设置:

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

结束吸气剂:

public boolean getMs_hide_arrow()
{
   return hideArrow ;
}

我收到关于缺少 getter 的错误消息:

错误:(171, 9) 找不到属性的 getter 'app:ms_hide_arrow' 值类型为布尔值 ...

Getter 在那里,怎么了?

【问题讨论】:

  • setMsHideArrow(boolean) 方法在MyControl?
  • 好吧,它有效,我是笨蛋吗?标准控件不公开任何设置器,但它们仍然有效。例如,我可以使用 android:entries 作为 Spinner。 Spinner 没有公开任何 setEntries 方法
  • AbsSpinnerBindingAdapter.javaandroid.databinding.adapter包中,如果你没有来源见:android.googlesource.com/platform/frameworks/data-binding/+/…
  • 还是有问题。我尝试了 2-way binding,它抱怨缺少 getter,即使 getter 在那里。有什么想法吗?
  • 那么你得到的错误是什么?

标签: java android attributes custom-controls android-databinding


【解决方案1】:

例如在您的视图模型中创建这样的 bindingAdapter(您可以为所有 binderAdapter 创建一个类):

@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}"
/>

【讨论】:

    猜你喜欢
    • 2018-03-24
    • 2016-06-06
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多