android - 在 Viewpager 中使用具有相同 ViewModel 的相同 Fragment 的多个实例时出现问题

标签 android android-fragments android-viewpager android-architecture-components android-viewmodel

我有一个带有 View 模型 (VM1) 的 fragment (FRAG1)。我正在 FragmentPagerAdapter 中创建此 fragment 的两个新实例以加载到 ViewPager 中。

Viewpager 存在于父 Fragment 中。

两个 fragment 实例中的 ViewModels 似乎都不是唯一的。这两个 fragment 实例似乎都具有在最后初始化的第二个 fragment 中创建的 ViewModel 实例的属性。

private inner class ItDeclarationFragAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm)
{
    override fun getItem(position: Int): Fragment
    {
        return when (position)
        {
            0 -> ITDeclarationSummaryFragment.newInstance(false)
            1 -> ITDeclarationSummaryFragment.newInstance(true)

            else -> ITDeclarationSummaryFragment.newInstance(false)
        }
    }

    override fun getCount(): Int
    {
        return 2
    }

    override fun getPageTitle(position: Int): CharSequence?
    {
        return when (position)
        {
            0 -> resources.getString(R.string.zpl_itDeclaration_tile)
            1 -> resources.getString(R.string.zpl_itDeclaration_poi_title)

            else -> resources.getString(R.string.zpl_reimbursements_summary)
        }
    }
}

Fragment 在 OnCreate() 中创建新的 ViewModel 实例

override fun onCreate(savedInstanceState: Bundle?)
{
    super.onCreate(savedInstanceState)

    vm = ViewModelProvider.AndroidViewModelFactory.getInstance(activity!!.application).create(ITDeclarationSummaryViewModel::class.java)
    vm.setRepository(getRepo())
    vm.mIsPOI = arguments!![StringConstants.isPOI]!! as Boolean
}

稍后在 OnCreateView() 上设置为 Binding

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View?
{
    mView = inflater.inflate(R.layout.declaration_summary_fragment, container, false)

    mBinding       = DeclarationSummaryFragmentBinding.bind(mView!!)
    mBinding.model = vm
    mBinding.setLifecycleOwner(this)

    return mBinding.root
}

但是两个 fragment 中的 View 模型似乎都保留了第二个 fragment 的值。它们似乎并不是分离的和独特的。

例如,

View 模型中有一个 bool 值,在第一个 ViewModel 中为 FALSE,在第二个 ViewModel 中为 TRUE。但是一旦创建了第二个 VM,两个 fragment View 模型都将为 TRUE。

同样,第一个 ViewModel 中 LiveData 的观察者不起作用。

请帮我解决这个问题。提前致谢。

最佳答案

问题是您正在使用 AndroidViewModelFactory 创建 ViewModel,如果您在所有 fragment 中使用相同的 View 模型,它为所有 View 模型保存相同的实例。也许考虑通过调用创建 View 模型:

ViewModelProviders.of(fragment).get(ViewModel.class)

这将始终为每个 fragment 提供一个新的 View 模型实例。或者如果你想 Hook 相同的 Activity ,只需传递而不是 fragment , Activity 。

关于android - 在 Viewpager 中使用具有相同 ViewModel 的相同 Fragment 的多个实例时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52207779/

相关文章:

android - ImageLoader DisplayImage功能快速查询

android - 如何在 fragment Android Kotlin之间共享数据/对象

android - ViewPager 内的 LinearLayout 禁用滑动

Android Mapbox 标记 - 只有添加的第一个标记是可点击的

android - 一个可以将项目 rebase 到 Google AOSP 的 Gerrit 实例?

android - 如何使用带复数的字符串数组?

android - Shared ViewModel 的 onCleared() 从未被调用

java - 为什么 onAttach() 是 Activity 和 Fragment 之间通信所必需的?

android - fragment 在初始选项卡选择上重新初始化内容 - ANDROID

android - 在 android 中查看寻呼机指示器