与静态方法一起使用时,Data Binding给出NullPointerException

时间:2016-09-06 06:42:35

标签: android data-binding android-databinding

当我用NullPointerException课程格式化日期时,我收到StringUtils。如果我在没有StringUtils的情况下使用它,它就可以正常工作。

我添加了StringUtils

的import语句

我有这个:

<TextView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="@{StringUtils.getFormattedDate(user.date)}" />

这使我的StringUtils方法出错:

public static String getFormattedDate(String unformattedDate) {
        // unformattedDate will be in format of yyyy-mm-dd
        // Convert it to d mmm, yyyy
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        String date = null;
        try {
            Date d = df.parse(unformattedDate);   // <<--------- Here
            SimpleDateFormat dateFormat = new SimpleDateFormat("d MMM, yyyy");
            date = dateFormat.format(d.getTime());
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

当我使用调试器检查时,unformattedDate从一开始就是null。调用了正确的方法,但传递的值为null。这很奇怪。

当我在布局文件中使用它时:

<TextView
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="@{user.date}" />

它没有给我任何错误,日期显示在屏幕上!

我已经尝试清理项目并重新运行它。但没有成功。

2 个答案:

答案 0 :(得分:1)

当您第一次运行时user没有任何值,直到您从Firebase数据库获取它,因此user.date也将为空。

放三元:

android:text="@{user.date==null ? `` : StringUtils.getFormattedDate(user.date)}"

答案 1 :(得分:1)

数据绑定本身是空安全的,但这并不适用于将值用作参数。由于getFormattedDate()是您的更改,因此请确保它也是无效的。如果还有ParseException,您已经返回null。

public static String getFormattedDate(String unformattedDate) {
    try {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date d = df.parse(unformattedDate);
        SimpleDateFormat dateFormat = new SimpleDateFormat("d MMM, yyyy");
        return dateFormat.format(d.getTime());
    } catch (Exception e) {
        Log.w("StringUtils", "getFormattedDate", e);
        return null;
    }
}