与静态方法一起使用时数据绑定给出 NullPointerException

Data Binding giving NullPointerException when used with static method

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

我已经为 StringUtils

添加了导入语句

我有这个:

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

没有报错,屏幕上显示了日期!

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

当你第一次 运行 它 user 没有任何价值,直到你从 Firebase 数据库中获取它,所以 user.date 也将为空。

输出三元:

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

数据绑定本身是空值安全的,但这不适用于将值用作参数。由于 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;
    }
}