android中WindowManager添加ComposeView时异常:java.lang.IllegalStateException 问题
今天使用compose写好ui后,用WindowManager.addView(composeView, lp);。运行发现报错:java.lang.IllegalStateException: ViewTreeLifecycleOwner not found from androidx.compose.ui.platform.ComposeView在stackoverflow看到解决方法如下创建
·
今天使用compose写好ui后,用WindowManager.addView(composeView, lp);。运行发现报错:
java.lang.IllegalStateException: ViewTreeLifecycleOwner not found from androidx.compose.ui.platform.ComposeView
在stackoverflow看到解决方法如下
创建KeyboardViewLifecycleOwner.kt文件
class KeyboardViewLifecycleOwner :
LifecycleOwner, ViewModelStoreOwner, SavedStateRegistryOwner {
fun onCreate() {
savedStateRegistryController.performRestore(null)
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
}
fun onResume() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
}
fun onPause() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE)
}
fun onDestroy() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
store.clear()
}
/**
Compose uses the Window's decor view to locate the
Lifecycle/ViewModel/SavedStateRegistry owners.
Therefore, we need to set this class as the "owner" for the decor view.
*/
fun attachToDecorView(decorView: View?) {
if (decorView == null) return
ViewTreeLifecycleOwner.set(decorView, this)
ViewTreeViewModelStoreOwner.set(decorView, this)
ViewTreeSavedStateRegistryOwner.set(decorView, this)
}
// LifecycleOwner methods
private val lifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this)
override fun getLifecycle(): Lifecycle = lifecycleRegistry
// ViewModelStore methods
private val store = ViewModelStore()
override fun getViewModelStore(): ViewModelStore = store
// SavedStateRegistry methods
private val savedStateRegistryController = SavedStateRegistryController.create(this)
override fun getSavedStateRegistry(): SavedStateRegistry =
savedStateRegistryController.savedStateRegistry
}
在Activity中使用
class MainActivity : ComponentActivity() {
private val lifecycleOwner = KeyboardViewLifecycleOwner()
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
lifecycleOwner.onCreate()
}
override fun onResume() {
super.onResume()
lifecycleOwner.onResume()
}
override fun onPause() {
super.onPause()
lifecycleOwner.onPause()
}
override fun onDestroy() {
super.onDestroy()
lifecycleOwner.onDestroy()
}
}
在activity加入属性lifecycleOwner并赋值KeyboardViewLifecycleOwner(),然后再对应的activity回调方法中调用lifecycle的方法
最后调用lifecycleOwner的attachToDecorView方法传入composeView即可
val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val lp = WindowManager.LayoutParams()
wm.addView(composeView, lp)
更多推荐
所有评论(0)