Android - databinding/livedata/resourceId TextView error



我正在使用数据绑定,我想通过LiveData将文本设置为TextView,如下所示:

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)

它崩溃的可能性很大,因为当屏幕打开时,livedata int值为O,并且它被发送到文本视图,并且崩溃是因为没有resId==0

如何绕过这个?第二个问题是,这样使用livedata是一个好方法,还是没有必要?

UPDATE我用它来绕过零值:

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

是的。这是正确的方法,但这里有一些修改您可以尝试。

在您的ViewModel

val toolbarTitle = MutableLiveData<String>()

将其更改为字符串。

为其设置值时

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

您可以拥有应用程序上下文,这将起作用。

您还可以将直接从活动或片段设置为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"

最新更新