簡體   English   中英

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!!")
    }
}

上述設置在無配置更改環境下運行良好,當應用程序進入后台時調用showOnStopMessage() showOnStartMessage() ,當應用程序返回前台時調用 showOnStartMessage()。

問題是,當配置更改發生時(如旋轉屏幕),這些函數不再被調用。

為什么會發生這種情況? 如何檢測和“生存”配置更改? 提前致謝。

據我了解,問題在於您的 ViewModel 僅創建一次(應該如此),並且它僅將第一個片段的生命周期添加為 LifecycleObserver。 當您旋轉屏幕時,會返回相同的 ViewModel,它仍會嘗試對舊 Fragment 的更改做出反應,這不會發生。

我建議根本不處理 ViewModel 中的生命周期(從 Factory 和 ViewModel 中刪除相關代碼)。 只需致電:

lifecycle.addObserver(viewModel)

在獲得 ViewModel 之后,在 onCreateView 中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM