Android 生命周期感知组件如何检测 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 中。