在片段布局中使用活动视图模型与数据绑定



尝试使用数据绑定访问活动视图片段布局中的模型。我不确定我只是做错了什么,还是

它不起作用。MainViewModel 有一个名为 _dateString 的 MutableLiveData 属性,以及一个名为 getDateString(( 的函数,该函数返回该属性的 LiveData。

private val _dateString = MutableLiveData<String>()
fun getDateString(): LiveData<String> {
return _dateString
}

然后在日历片段的布局中调用该函数。我在布局的数据部分同时拥有主模型和视图模型。(我删除了大部分布局,以便于阅读(

<layout
xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View" />
<variable
name="mainModel"
type="{path}.features.main.MainViewModel" />
<variable
name="viewModel"
type="{path}.features.main.calendar.CalendarViewModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true">
<Button
android:id="@+id/header_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
style="@style/Widget.MaterialComponents.Button"
android:text="@{mainModel.getDateString()}"/>
</androidx.constraintlayout.widget.ConstraintLayout>

在片段本身中,我随后将变量绑定为这样

binding = FragCalendarBinding.inflate(inflater, container, false).apply {
viewModel = model
mainModel = mainModel
listener = this@CalendarFragment
lifecycleOwner = this@CalendarFragment
}

无论出于何种原因,布局都会显示没有值的按钮。即使我更新了_dateString,绑定也不会显示更改的字符串。

如果我将相同的逻辑移动到日历视图模型中,它确实会显示并更新。如果我在日历的片段代码中调用 getDateString((,它会正确返回值。

您是否无法将多个视图模型连接到单个布局?还是我在这里做错了什么。

我想我回答这个问题已经很晚了。 无论如何,只需以这种方式编辑您的 XML 文件

<Button
android:id="@+id/header_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
style="@style/Widget.MaterialComponents.Button"
android:text="@{mainModel._dateString}"/>

您可以像这样封装 ViewModel 数据,以消除对函数调用的需要:

private var _dateString = MutableLiveData<String>()
val dateString : LiveData<String>
get() = _dateString

这允许您访问视图模型外部的值作为dateString然后在XML中,您现在可以将文本的值分配给@{mainmodel.dateString}并且该值将在更改时自动更新

最新更新