![](/img/trans.png)
[英]How do I return function value in lifecycle-aware coroutine scope in Android?
[英]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.