Har*_*amy 3 android android-fragments android-viewpager android-viewmodel android-architecture-components
我有一个带有视图模型 (VM1) 的片段 (FRAG1)。我正在 FragmentPagerAdapter 中创建此片段的两个新实例以加载到 ViewPager 中。
Viewpager 存在于父 Fragment 中。
两个片段实例中的 ViewModels 似乎都不是唯一的。两个片段实例似乎都具有在最后初始化的第二个片段中创建的 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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
稍后在 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
}
Run Code Online (Sandbox Code Playgroud)
但是两个片段中的视图模型似乎都保留了第二个片段的值。它们似乎并不独立和独特。
例如,
视图模型中有一个布尔值,在第一个 ViewModel 中为 FALSE,在第二个中为 TRUE。但是一旦创建了第二个 VM,片段视图模型就会为 TRUE。
同样,第一个 ViewModel 中 LiveData 的观察者不起作用。
请帮我解决这个问题。提前致谢。
小智 5
问题是您正在使用 AndroidViewModelFactory 创建 ViewModels,如果您在所有片段中使用相同的视图模型,它为所有视图模型保存相同的实例。也许可以考虑通过调用来创建视图模型:
ViewModelProviders.of(fragment).get(ViewModel.class)
Run Code Online (Sandbox Code Playgroud)
这将始终为您提供每个片段的视图模型的新实例。或者,如果您想挂钩相同的活动,只需传递而不是片段,活动。
| 归档时间: |
|
| 查看次数: |
1862 次 |
| 最近记录: |