MutableLiveData 的 Android XML 绑定不起作用

Har*_*nan 3 android android-databinding android-livedata android-viewmodel android-architecture-components

我有一个活动,CoordinatorLayout其中包含一个CollapsingToolbarLayout. 我已将活动的标题绑定到 的title属性CollapsingToolbarLayout,如下所示(由于布局太大,仅发布代码的相关部分):

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <data>
        <variable name="viewModel"
                  type="com.android.myapp.ui.activity.home.HomeActivityViewModel"/>
    </data>
    <RelativeLayout 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"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">

        <androidx.drawerlayout.widget.DrawerLayout
                android:id="@+id/drawerLayout"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:focusableInTouchMode="true">

            <androidx.coordinatorlayout.widget.CoordinatorLayout
                    android:id="@+id/main_content"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent">

                <com.google.android.material.appbar.AppBarLayout
                        android:id="@+id/app_bar_layout"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:layout_behavior="com.android.myapp.ui.behavior.scroll.appbar.DisableableAppBarLayoutBehavior"
                        android:fitsSystemWindows="true">

                    <com.google.android.material.appbar.CollapsingToolbarLayout
                            android:id="@+id/appbar"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:fitsSystemWindows="true"
                            app:title="@{viewModel.pageTitle}"
                            app:collapsedTitleTextAppearance="@style/CollapsedAppBarTitleStyle"
                            app:contentScrim="?attr/colorPrimary"
                            app:expandedTitleGravity="bottom|center_horizontal"
                            app:expandedTitleMarginBottom="85dp"
                            app:expandedTitleTextAppearance="@style/ExpandedAppBarTitleStyle"
                            app:layout_scrollFlags="scroll|exitUntilCollapsed">
        <!--Remaining layout-->
</layout>
Run Code Online (Sandbox Code Playgroud)

如您所见,该pageTitle属性绑定到 xmlCollapsingToolbarLayout title属性。

现在在HomeActivityViewModel

class HomeActivityViewModel(application: Application) : AndroidViewModel(application) {
    var isToolbarExpandable = MutableLiveData<Boolean>() // For handling the expansion of toolbar on navigation. This works perfectly
    var pageTitle = MutableLiveData<String>()

    init {
        isToolbarExpandable.value = true
        pageTitle.value = "Home"
    }
}
Run Code Online (Sandbox Code Playgroud)

并在HomeActivity

class HomeActivity : AppCompatActivity() {
    private lateinit var homeViewModel: HomeActivityViewModel
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivitySafaricomHomeBinding>(this, R.layout.activity_safaricom_home)
        binding.lifecycleOwner = this
        setSupportActionBar(toolbar)
        homeViewModel = getHomeViewModel()
        binding.viewModel = homeViewModel
    }

    private fun getHomeViewModel(): HomeActivityViewModel = ViewModelProviders.of(this).get(HomeActivityViewModel::class.java)
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,页面标题设置正确。但是,当我在 Activity 并创建第一个子片段之后的任何时间尝试设置标题时,麻烦就开始了(我正在使用NavHostFragment,因此在创建活动后立即创建并附加第一个片段)。我唯一可以更改标题的地方是启动片段的onCreate活动和onCreate生命周期方法。我使用视图模型作为共享视图模型来更改所有子片段的标题。我使用以下方法获取 Fragments 中的 ViewModel:

ViewModelProviders.of(activity!!).get(HomeActivityViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

之后,每当我尝试更改标题时,简单的不会更改。无论是点击按钮,延迟后,在下一个片段上,都没有任何效果。唯一的工作地点是onCreateActivity 直到onCreateView第一个片段。我为pageTitlein添加了一个观察者HomeActivity,但是在第一次更改之后,甚至没有触发观察者。在调试时,我可以看到它是检索到的视图模型的同一个实例,并且pageTitle实际上正在更改,但它只是在创建后停止观察。知道这里有什么问题吗?请帮忙。

the*_*e64 7

LiveData不能使用,DataBinding因为它没有生命周期。

binding.viewModel = homeViewModel
Run Code Online (Sandbox Code Playgroud)

尝试添加

binding.lifecycleOwner = this
Run Code Online (Sandbox Code Playgroud)

所以,大家一起

binding.viewModel = homeViewModel
binding.lifecycleOwner = this
Run Code Online (Sandbox Code Playgroud)