Android-数据绑定/livedata/resourceId文本视图错误

Android-数据绑定/livedata/resourceId文本视图错误,android,data-binding,android-livedata,Android,Data Binding,Android Livedata,我正在使用数据绑定,我想通过LiveData将文本设置为TextView,如下所示: binding.lifecycleOwner = viewLifecycleOwner binding.viewModel = viewModel 设置文本视图的步骤 viewModel.toolbarTitle.postValue(R.string.profile_title_my_documents) 视图模型实现 val toolbarTitle = MutableLiveData<@andro

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

binding.lifecycleOwner = viewLifecycleOwner
binding.viewModel = viewModel
设置文本视图的步骤

viewModel.toolbarTitle.postValue(R.string.profile_title_my_documents)
视图模型实现

val toolbarTitle = MutableLiveData<@androidx.annotation.StringRes Int>()
它最有可能崩溃,因为当屏幕打开时,livedata int值为O,它被发送到textview,并且由于没有resId==0而崩溃

如何避开这个问题?第二个问题,这是像这样使用livedata的好方法还是没有必要

更新 我用这个来计算零值:

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

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

在您的
视图模型中

val toolbarTitle = MutableLiveData<String>()
您可以拥有应用程序上下文,这将起作用

您还可以将直接从活动或片段设置为xml。这里,您在活动中所做的是在viewmodel中设置该值,然后将viewmodel从活动设置为xml

直接途径是:


谢谢,这确实有效,但老实说,每次都要添加getstring会是额外的工作,我会认为有一些方法可以自动使用resIds,但这是有意义的,因为如果值为零,它通常会崩溃。好吧,我想我明白了,我改为:
android:text=@{viewModel.toolbarTitle==0?”:context.getString(viewModel.toolbarTitle)}'
Yes,不过您可以尝试为实时数据设置默认值。
val-toolbarTitle=MutableLiveData()。应用{postValue(R.string.profile_title_my_documents)}
您在ViewModel中传递了上下文,这有点违背了ViewModel的目的。请阅读
android:text='@{viewModel.toolbarTitle == 0 ? "" : context.getString(viewModel.toolbarTitle)}'
val toolbarTitle = MutableLiveData<String>()
viewModel.toolbarTitle.postValue(context.getString(R.string.profile_title_my_documents))
 <?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"