Android 生命周期感知组件如何检测 ViewModel 内部的配置更改
Android How Lifecycle-Aware Components Detect Configuration Change inside ViewModel
我的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 中。
我的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 中。