Android-数据绑定/livedata/resourceId文本视图错误
我正在使用数据绑定,我想通过LiveData将文本设置为TextView,如下所示: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
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"