我正在 Jetpack Compose AndroidViewBinding 中加载一个片段,如下所示,
val fragmentManager = (LocalContext.current as? FragmentActivity)?.supportFragmentManager
AndroidViewBinding(
modifier = Modifier.fillMaxSize(),
factory = { inflater, parent, attachToParent ->
val binding = ConsumerOdrdGoogleMapLayoutBinding.inflate(inflater, parent, attachToParent)
val consumerOdrdFragment = ConsumerODRDMapFragment.newInstance("test")
fragmentManager?.beginTransaction()
?.replace(binding.consumerSdkFragmentContainer.id, consumerOdrdFragment, TAG)
?.commitAllowingStateLoss()
binding
}
)
我在某些边缘情况下遇到了下面提到的崩溃,并且我无法重现该问题来解决此问题。
Fatal Exception: java.lang.IllegalArgumentException: No view found for id 0x7f0900cf (com.app.myapp.staging:id/consumer_sdk_fragment_container) for fragment ConsumerODRDMapFragment{51aa5f7} (3f2e436a-01b1-48a0-a96e-600816efdab8 id=0x7f0900cf tag=ConsumerODRDMapView)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:513)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1840)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1758)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1701)
at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:488)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7872)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
您希望插入片段的 xml 容器的 ID 应该是您在
add()
或 replace()
中使用的 ID。片段本身中不会有任何可以从活动引用的带有 id 的视图,因为片段 xml 布局尚未加载,并且只能由片段访问。
在您的情况下,似乎发生了崩溃,因为在使用
consumer_sdk_fragment_container
的片段事务期间无法找到 id 为 ConsumerODRDMapFragment
的视图。检查视图 id 是否存在于由 ConsumerOdrdGoogleMapLayoutBinding
膨胀的布局中。此外,确保在布局完全膨胀后执行片段事务。如果视图尚未膨胀或者在事务时它不是布局层次结构的一部分,则可能会发生这种情况。
检查以下几点:
ConsumerOdrdGoogleMapLayoutBinding.inflate(inflater, parent, attachToParent)
正确地膨胀包含 consumer_sdk_fragment_container
binding.consumerSdkFragmentContainer
是否已正确初始化并可在布局中访问AndroidViewBinding
是否正在初始化并添加到视图层次结构中childFragmentManager
而不是 supportFragmentManager
此外,必须小心处理片段事务,特别是使用
commitAllowingStateLoss()
,确保在应用程序生命周期的那个时刻调用它是安全的。
这个问题应该包括更多细节并澄清问题。 所以请贴出完整的代码,以便我们能够更准确地回答。谢谢