将参数传递给方法的Android数据绑定

时间:2018-10-10 13:53:29

标签: android android-databinding

  

首先,此问题与'onClick'事件参数传递无关。

我有一个DateUtil类,具有以下一种方法:

public static String formatDate(long date) {
        SimpleDateFormat dateFormat;
        dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
        Calendar c = Calendar.getInstance();

        dateFormat.setTimeZone(TimeZone.getDefault());
        c.setTimeInMillis(date);
        return dateFormat.format(c.getTimeInMillis());
    }

我的模型CommentEntity具有以下属性:

 private int id;
 private int productId;
 private String text;
 private Date postedAt;

现在在一种布局中,我正在显示注释。

<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <variable name="comment"
                  type="com.example.entity.CommentEntity"/>
        <variable
        name="dateUtil"
        type="com.example.util.DateUtil"/>

    </data>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="8dp"
                android:layout_alignParentRight="true"
                android:layout_below="@id/item_comment_text"

                //This line gives error for data binding
                android:text="@{dateUtil.formatDate(comment.postedAt.time)}"/>
</layout>

我得到的错误是:

  

找不到方法   类中的formatDate(com.example.util.DateUtil)   长

现在,如果我修改formatDate()方法也是一样,因为默认情况下它将花费当前时间,因此删除数据绑定中传递的参数,它将完美地工作。

那么我是在做错什么还是错误?

请提供在数据绑定中将参数传递给方法的问题的解决方案。

2 个答案:

答案 0 :(得分:3)

尝试以下方法:

  1. 不要直接从 xml
  2. 中的数据绑定中获取 DateUtil 类对象

在您的 CommentEntity模型类中制作一个 BindingAdapter 方法,如下所示:

@BindingAdapter("android:text")
public static void setPaddingLeft(TextView view, long date) {
    view.setText(DateUtil.formatDate(long));
}

然后针对XML使用以下代码:

<TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:layout_alignParentRight="true"
            android:layout_below="@id/item_comment_text"
            android:text="@{comment.postedAt.time}"/>

说明:

如果您想基于数据模型视图应用一些自定义逻辑,则需要使用 BindingAdapter 做那个工作。因此,您可以提供一些自定义标签或使用需要在其上设置逻辑的任何默认android:标签。

我拒绝使用DateUtil绑定适配器,因为您可能也在其他地方使用了它的方法。因此建议在模型中为该逻辑创建新方法,以使核心逻辑保持不变。 (不过,您可以将DateUtils用于此逻辑,只需将其设置为 BindingAdapter )。

答案 1 :(得分:0)

因为您想在 DateUtil 中使用静态方法,所以应该导入它:

<data>
    <variable ... />
    <import type="foo.bar.DateUtil"/>
</data>

并在TextView中:

<TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="8dp"
                android:layout_alignParentRight="true"
                android:layout_below="@id/item_comment_text"
               //use DateUtil directly-
                android:text="@{DateUtil.formatDate(comment.postedAt.time)}"/>

您的错误试图将其用作 variable - 这告诉数据绑定期望此类实例绑定到您的 UI 类(Fargment/Activity)中的某处