我的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!!")
}
}
上述设置在无配置更改环境中运行良好,应用程序转到后台时调用showOnStopMessage()
,应用程序返回前台时调用showOnStartMessage()
。
问题是,当配置更改时(如旋转屏幕(,这些函数将不再被调用。
为什么会发生这种情况?如何检测和";生存";配置更改?提前谢谢。
据我所知,问题是ViewModel只创建了一次(应该是这样(,而且它只将第一个片段的生命周期添加为LifecycleObserver。当您旋转屏幕时,会返回相同的ViewModel,它仍然会尝试对旧片段的更改做出反应,但这不会发生。
我建议根本不处理ViewModel内部的生命周期(从Factory和ViewModel中删除相关代码(。只需致电:
lifecycle.addObserver(viewModel)
在获得ViewModel之后,在onCreateView内部。