gpt4 book ai didi

android - Jetpack 撰写 : Crash when adding view to window manager

转载 作者:行者123 更新时间:2023-12-04 23:44:48 25 4
gpt4 key购买 nike

我尝试将 jetpack compose View 添加到应用程序覆盖 View 的窗口管理器。但是应用程序崩溃了。我使用以下代码添加了 jetpack compose View 。当我尝试 XML 布局时,它工作正常。还有其他人遇到过这个问题吗?提前致谢。

private val overlayWindowManager by lazy {
getSystemService(Context.WINDOW_SERVICE)
as WindowManager
}

private fun initWindowManager() {
val params = WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT
)
params.gravity = Gravity.RIGHT or Gravity.TOP
overlayWindowManager.addView(ComposeView(this).apply {
setContent { Text("WINDOW") }
}, params)
}
错误日志
 java.lang.IllegalStateException: ViewTreeLifecycleOwner is not present in this window. Use ComponentActivity, FragmentActivity or AppCompatActivity to configure ViewTreeLifecycleOwner automatically, or call ViewTreeLifecycleOwner.set() for this View or an ancestor in the same window.
at androidx.compose.ui.platform.AbstractComposeView.onAttachedToWindow(ComposeView.kt:176)
at android.view.View.dispatchAttachedToWindow(View.java:20479)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3489)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2417)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1952)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8171)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
at android.view.Choreographer.doCallbacks(Choreographer.java:796)
at android.view.Choreographer.doFrame(Choreographer.java:731)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)

最佳答案

ComposeView 需要一个 LifecycleOwner,但是我们这里没有,所以我们必须创建它。

internal class MyLifecycleOwner : SavedStateRegistryOwner {

private var mLifecycleRegistry: LifecycleRegistry = LifecycleRegistry(this)
private var mSavedStateRegistryController: SavedStateRegistryController = SavedStateRegistryController.create(this)

val isInitialized: Boolean
get() = true

override fun getLifecycle(): Lifecycle {
return mLifecycleRegistry
}

fun setCurrentState(state: Lifecycle.State) {
mLifecycleRegistry.currentState = state
}

fun handleLifecycleEvent(event: Lifecycle.Event) {
mLifecycleRegistry.handleLifecycleEvent(event)
}

override fun getSavedStateRegistry(): SavedStateRegistry {
return mSavedStateRegistryController.savedStateRegistry
}

fun performRestore(savedState: Bundle?) {
mSavedStateRegistryController.performRestore(savedState)
}

fun performSave(outBundle: Bundle) {
mSavedStateRegistryController.performSave(outBundle)
}
}
然后使用 MyLifecycleOwner作为 composeView 的 ViewTreeLifecycleOwner。
private fun initWindowManager() {
val params = ...
val composeView = ComposeView(context = context)
composeView.setContent { . . . }

val lifecycleOwner = MyLifecycleOwner()
lifecycleOwner.performRestore(null)
lifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
ViewTreeLifecycleOwner.set(composeView, lifecycleOwner)
ViewTreeSavedStateRegistryOwner.set(composeView, lifecycleOwner)

val viewModelStore = ViewModelStore()
ViewTreeViewModelStoreOwner.set(composeView) { viewModelStore }

overlayWindowManager.addView(composeView, params)
}
您可以在此处查看更多详细信息 https://gist.github.com/handstandsam/6ecff2f39da72c0b38c07aa80bbb5a2f

关于android - Jetpack 撰写 : Crash when adding view to window manager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64585547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com