Не работает новый Date () в xml с привязкой данных - PullRequest
1 голос
/ 11 февраля 2020

Andrdoid Studio 3.6

 public static Date getDateFromString(String date, String dateFormat) {
        try {
            DateFormat df = new SimpleDateFormat(dateFormat);
            Date dateResult = df.parse(date);
            return dateResult;
        } catch (ParseException e) {
            //e.printStackTrace();
            return null;
        }
    }

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <import type="java.util.Date" />

        <import type="com.myproject.common.util.date.DateUtil" />

        <variable
            name="model"
            type="com.myproject.api.model.Profile" />

    </data>


  <TextView
                        android:id="@+id/textView2"
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:text='@{DateUtil.getDateAsString(model.paidDate, "EEEE dd MMMM")}'
                        android:textSize="12sp"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintEnd_toStartOf="@+id/profileImageView"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toBottomOf="@+id/textView" />

и это прекрасно работает.

Но это не работает:

            <TextView
                android:id="@+id/textView2"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:text='@{DateUtil.getDateAsString(new Date(), "EEEE dd MMMM")}'
                android:textSize="12sp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toStartOf="@+id/profileImageView"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/textView" />

получить ошибку:

java.lang.NullPointerException
    at android.databinding.tool.util.XmlEditor.defaultReplacement(XmlEditor.java:361)
    at android.databinding.tool.util.XmlEditor.recurseReplace(XmlEditor.java:309)
    at android.databinding.tool.util.XmlEditor.recurseReplace(XmlEditor.java:328)
    at android.databinding.tool.util.XmlEditor.recurseReplace(XmlEditor.java:328)
    at android.databinding.tool.util.XmlEditor.recurseReplace(XmlEditor.java:328)
    at android.databinding.tool.util.XmlEditor.recurseReplace(XmlEditor.java:328)
    at android.databinding.tool.util.XmlEditor.strip(XmlEditor.java:90)
    at android.databinding.tool.store.LayoutFileParser.stripBindingTags(LayoutFileParser.java:477)
    at android.databinding.tool.store.LayoutFileParser.stripFile(LayoutFileParser.java:450)
    at android.databinding.tool.store.LayoutFileParser.parseXml(LayoutFileParser.java:95)
    at android.databinding.tool.LayoutXmlProcessor.processSingleFile(LayoutXmlProcessor.java:158)
    at com.android.build.gradle.tasks.MergeResources$CreationAction$1.processSingleFile(MergeResources.java:748)

enter image description here

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Ниже код будет работать для вас. в TextView я использовал пользовательский атрибут, который мы должны упомянуть в BindingAdapter,

Binding Adapter будет иметь функцию верхнего уровня, как упомянуто ниже.


<layout>
 <data>
    <variable
        name="project"
        type="com.mvvm_architecture.model.Project" />

    <variable
        name="isLoading"
        type="Boolean" />
 </data>

 <androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- Project Language -->
    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/tv_created_at"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:fontFamily="sans-serif-light"
        android:gravity="center"
        android:textColor="@android:color/black"
        android:textSize="14sp"
        app:formattedText="@{project.created_at}"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


 </androidx.constraintlayout.widget.ConstraintLayout>


@BindingAdapter("app:formattedText")
fun formattedText(view: View, text: String?) {
   (view as AppCompatTextView).text = if (text == null || text.isEmpty()) {
      ""
   } else {
    val simpleDateFormat = SimpleDateFormat(Constants.DATE_FORMAT,Locale.getDefault())
    val date = simpleDateFormat.parse(text)
    DateUtils.getRelativeTimeSpanString(date?.time ?: 0).toString()
   }
}
0 голосов
/ 11 февраля 2020

Синтаксис выражения привязки данных не включает использование ключевого слова new для создания объекта. new специально вызывается как отсутствующий в документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...