首页 > 解决方案 > 在 Activity 和 Fragment 之间使用共享视图模型,但 UI 上没有更新

问题描述

我正在做一个注册过程,它分为三个步骤,所以我在所有三个片段和注册活动之间使用共享视图模型。我想要做的是在我加载下一个片段后,我进行了一些 UI 更新以显示另一个工具栏,正在工作的是替换片段,他成功地加入了更新 UI 方法,但在 UI 上没有进行任何更改


    override fun navigateToSignUp() {
        setFragment(
            R.id.home_frame,
            SignUpFragment()
        )
        showTitleInToolbarBackParam("Register", true)
    }
 private fun showTitleInToolbarBackParam(title: String, back: Boolean) {
        Log.e(TAG, "showTitleInToolbarBackParam: ")
        getDataBinding()!!.appbar.toolbar.visibility = VISIBLE
        getDataBinding()!!.homeappbar.homeappbar.visibility = GONE
        getDataBinding()!!.appbar.titleTextView.text = title
        if (back)
            getDataBinding()!!.appbar.backImageView.visibility = VISIBLE
        else
            getDataBinding()!!.appbar.backImageView.visibility = GONE

    }

class SignUpFragment : BaseFragment<FragmentSignUpBinding>() {
    private lateinit var viewModel: WelcomingViewModel
    override fun setViewModel() {
        viewModel = activity.run {
            ViewModelProviders.of(this!!).get(WelcomingViewModel::class.java)
        }
    }

    override fun init() {
        getDataBinding().viewModel = viewModel
    }


    override fun getLayoutId(): Int {
        return R.layout.fragment_sign_up
    }

}
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<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="com.itchek.presentation.welcoming.WelcomingViewModel" />
    </data>

在 XML 文件中所有片段的绑定中,我使用了相同的视图模型

这是我遇到的问题

标签: androidandroid-fragmentskotlinviewmodel

解决方案


膨胀片段的现代方式是导航。使用 addOnDestinationChangedListener() 函数更改工具栏的标题或可见性。

val navController = findNavController(R.id.nav_host_fragment)
navController.addOnDestinationChangedListener { _, destination, _ ->

    when (destination.id) {
        R.id.navigation_list -> {
            navBar.visibility = View.GONE
            supportActionBar!!.title = "List"
            supportActionBar!!.setDisplayHomeAsUpEnabled(true)
        }
        R.id.navigation_select -> {
            navBar.visibility = View.GONE
            supportActionBar!!.title = "Select"
            supportActionBar!!.setDisplayHomeAsUpEnabled(true)
        }
        else -> {
            navBar.visibility = View.VISIBLE
            supportActionBar!!.title = getString(R.string.app_name)
            supportActionBar!!.setDisplayHomeAsUpEnabled(false)
        }
    }
}

推荐阅读