问题描述
我的Fragment
:
class FirstFragment : Fragment() {
private lateinit var binding: FragmentFirstBinding
private lateinit var viewmodelFactory: FirstviewmodelFactory
private lateinit var viewmodel: Firstviewmodel
override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View {
binding = DataBindingUtil.inflate(inflater,R.layout.fragment_first,container,false)
viewmodelFactory = FirstviewmodelFactory(requireActivity().application,this.lifecycle) //<- Lifecycle object
viewmodel = viewmodelProvider(this,viewmodelFactory).get(Firstviewmodel::class.java)
return binding.root
}
}
我的viewmodel:
class Firstviewmodel(application: Application,lifecycle: Lifecycle) : Androidviewmodel(application),LifecycleObserver {
init {
lifecycle.addobserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
private fun showOnStopMessage() {
Log.v("xxx","onStop called!!")
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
private fun showOnStartMessage() {
Log.v("xxx","onStart called!!")
}
}
上述设置在no-configuration-change环境下运行良好,当应用进入后台时调用showOnStopMessage()
,当应用进入时调用showOnStartMessage()
回到前台。
问题是,当配置变化发生时(比如旋转屏幕),这些函数不再被调用。
为什么会这样?如何检测和“幸存”配置变化?提前致谢。
解决方法
据我所知,问题是您的 ViewModel 只创建了一次(应该如此),并且它只将第一个片段的生命周期添加为 LifecycleObserver。当您旋转屏幕时,会返回相同的 ViewModel,它仍会尝试对旧 Fragment 的更改做出反应,而这不会发生。
我建议根本不要处理 ViewModel 内部的生命周期(从 Factory 和 ViewModel 中删除相关代码)。只需致电:
lifecycle.addObserver(viewModel)
在获得 ViewModel 之后,在 onCreateView 中。