致命异常:java.lang.IllegalArgumentException:在 AndroidViewBinding Jetpack Compose 中找不到 id 的视图

问题描述 投票:0回答:1

我正在 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)
android android-jetpack-compose fragment android-viewbinding android-jetpack-compose-material3
1个回答
0
投票

您希望插入片段的 xml 容器的 ID 应该是您在

add()
replace()
中使用的 ID。片段本身中不会有任何可以从活动引用的带有 id 的视图,因为片段 xml 布局尚未加载,并且只能由片段访问。

在您的情况下,似乎发生了崩溃,因为在使用

consumer_sdk_fragment_container
的片段事务期间无法找到 id 为
ConsumerODRDMapFragment
的视图。检查视图 id 是否存在于由
ConsumerOdrdGoogleMapLayoutBinding
膨胀的布局中。此外,确保在布局完全膨胀后执行片段事务。如果视图尚未膨胀或者在事务时它不是布局层次结构的一部分,则可能会发生这种情况。

检查以下几点:

  1. 确保
    ConsumerOdrdGoogleMapLayoutBinding.inflate(inflater, parent, attachToParent)
    正确地膨胀包含
    consumer_sdk_fragment_container
  2. 的布局
  3. 检查
    binding.consumerSdkFragmentContainer
    是否已正确初始化并可在布局中访问
  4. 在尝试替换片段之前,请验证
    AndroidViewBinding
    是否正在初始化并添加到视图层次结构中
  5. 如果要替换另一个片段中的片段,请考虑使用
    childFragmentManager
    而不是
    supportFragmentManager

此外,必须小心处理片段事务,特别是使用

commitAllowingStateLoss()
,确保在应用程序生命周期的那个时刻调用它是安全的。


需要细节或清晰度

这个问题应该包括更多细节并澄清问题。 所以请贴出完整的代码,以便我们能够更准确地回答。谢谢

© www.soinside.com 2019 - 2024. All rights reserved.