Android - ошибка привязки данных / в базе данных / resourceId TextView - PullRequest
0 голосов
/ 09 апреля 2020

Я использую привязку данных, я хочу установить текст для TextView через LiveData, например:

binding.lifecycleOwner = viewLifecycleOwner
binding.viewModel = viewModel

, чтобы установить текстовое представление

viewModel.toolbarTitle.postValue(R.string.profile_title_my_documents)

просмотреть реализацию модели

val toolbarTitle = MutableLiveData<@androidx.annotation.StringRes Int>()

, а затем xml (удалены ненужные вещи)

<?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>
    <variable
        name="viewModel"
        type="packagename.MyViewModel"
        />
  </data>

  <TextView
        android:id="@+id/title"
        style="@style/toolbar_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@{viewModel.toolbarTitle}"
        />
</layout>

, поэтому, в основном, если я удаляю LiveData и использую значение Int, все работает нормально, но с LiveData я получаю исключение:

2020-04-09 14:38:59.929 19744-19744/ E/AndroidRuntime: FATAL EXCEPTION: main
    Process: , PID: 19744
    java.lang.RuntimeException: Failed to call observer method
        at androidx.lifecycle.ClassesInfoCache$MethodReference.invokeCallback(ClassesInfoCache.java:226)

...
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x0
        at android.content.res.Resources.getText(Resources.java:348)
        at android.widget.TextView.setText(TextView.java:5831)
        at ToolbarBindingImpl.executeBindings(ToolbarBindingImpl.java:146)
        at androidx.databinding.ViewDataBinding.executeBindingsInternal(ViewDataBinding.java:472)
        at androidx.databinding.ViewDataBinding.executeBindingsOn(ViewDataBinding.java:486)
        at MyBindingImpl.executeBindings(MyBindingImpl.java:151)
        at androidx.databinding.ViewDataBinding.executeBindingsInternal(ViewDataBinding.java:472)
        at androidx.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:444)
        at androidx.databinding.ViewDataBinding$OnStartListener.onStart(ViewDataBinding.java:1685)
        at java.lang.reflect.Method.invoke(Native Method)

наиболее вероятно, что он аварийно завершает работу, потому что при открытии экрана значение int кода liveata равно O, и оно отправляется в текстовое представление и вылетает из-за отсутствия resId == 0

Как обойти это? и второй вопрос, является ли это хорошим подходом для использования таких данных, как литовата, или это не нужно?

ОБНОВЛЕНИЕ Я использовал это, чтобы обойти нулевые значения:

android:text='@{viewModel.toolbarTitle == 0 ? "" : context.getString(viewModel.toolbarTitle)}'

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Да. Это правильный подход, но вот некоторые изменения, которые вы можете попробовать.

в вашем ViewModel

val toolbarTitle = MutableLiveData<String>()

измените его на строку.

При установке значения для него

viewModel.toolbarTitle.postValue(context.getString(R.string.profile_title_my_documents))

У вас может быть контекст приложения, и это будет работать.

0 голосов
/ 09 апреля 2020

Вы также можете установить прямо из действия или фрагмента на xml. Здесь, что вы делаете из действия, вы устанавливаете это значение в viewmodel, после чего вы устанавливаете viewmodel из действия в xml.

Прямой путь:

 <?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>
        <variable
            name="viewModel"
            type="packagename.MyViewModel"
            />

        <variable
            name="title"
            type="String" />
    </data>

    <TextView
        android:id="@+id/title"
        style="@style/toolbar_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@{title}"
        />
</layout>

Из деятельности:

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