【问题标题】:Using Activity ViewModel in Fragment's Layout with Databinding在 Fragment 的布局中使用 Activity ViewModel 和数据绑定
【发布时间】:2019-12-16 09:46:43
【问题描述】:

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

MainViewModel 有一个名为 _dateString 的 MutableLiveData 属性,以及一个名为 getDateString() 的函数,该函数返回该属性的 LiveData。

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

然后在日历片段的布局中调用该函数。我在布局的数据部分有 mainModel 和 viewModel。 (我去掉了大部分布局,以便于阅读)

<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,绑定也不会显示更改后的字符串。

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

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

【问题讨论】:

    标签: android kotlin data-binding viewmodel androidx


    【解决方案1】:

    我想我回答这个问题迟到了。无论如何,只需以这种方式编辑您的 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}"/>
    

    【讨论】:

      【解决方案2】:

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

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

      这允许您以dateString 的形式访问 ViewModel 之外的值 然后在您的 XML 中,您现在可以将文本的值分配给 @{mainmodel.dateString},并且该值将在其更改时自动更新

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-26
        • 1970-01-01
        • 2017-10-01
        • 2016-12-06
        相关资源
        最近更新 更多