【问题标题】:android, crash on transition for my fragmentandroid,我的片段在过渡时崩溃
【发布时间】:2021-06-14 15:54:16
【问题描述】:

我的应用程序发生随机崩溃,看起来它们是在 android 内部代码上。一种是:

    java.lang.IllegalArgumentException: Only TabItem instances can be added to TabLayout
        at com.google.android.material.tabs.TabLayout.addViewInternal(TabLayout.java:1606)
        at com.google.android.material.tabs.TabLayout.addView(TabLayout.java:1589)
        at android.transition.TransitionUtils.createViewBitmap(TransitionUtils.java:192)
        at android.transition.TransitionUtils.copyViewImage(TransitionUtils.java:103)

和其他

    java.lang.IllegalStateException: ViewPager2 does not support direct child views
        at androidx.viewpager2.widget.ViewPager2.onViewAdded(ViewPager2.java:489)
        at android.view.ViewGroup.dispatchViewAdded(ViewGroup.java:5937)
        at android.view.ViewGroup.addViewInner(ViewGroup.java:6119)
        at android.view.ViewGroup.addView(ViewGroup.java:5884)
        at android.view.ViewGroup.addView(ViewGroup.java:5824)
        at android.transition.TransitionUtils.createViewBitmap(TransitionUtils.java:192)
        at android.transition.TransitionUtils.copyViewImage(TransitionUtils.java:103)

它们看起来都没有出现在我的代码中... 有没有人遇到过这些崩溃?

编辑:

堆栈跟踪的其余部分是常见的:

        at android.transition.TransitionUtils.copyViewImage(TransitionUtils.java:103)
        at android.transition.Visibility.onDisappear(Visibility.java:420)
        at android.transition.Visibility.createAnimator(Visibility.java:255)
        at android.transition.Transition.createAnimators(Transition.java:733)
        at android.transition.TransitionSet.createAnimators(TransitionSet.java:444)
        at android.transition.Transition.playTransition(Transition.java:1777)
        at android.transition.TransitionManager$MultiListener.onPreDraw(TransitionManager.java:327)
        at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:1124)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3867)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2631)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9978)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1010)
        at android.view.Choreographer.doCallbacks(Choreographer.java:809)
        at android.view.Choreographer.doFrame(Choreographer.java:744)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:995)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:246)
        at android.app.ActivityThread.main(ActivityThread.java:8506)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

它发生在 android 10 而不是 android 7-9 上,看起来它正在尝试创建当前片段的位图,但当前片段包含 TabLayout 和 viewPager 并且不受支持。 调试我看到它试图在 TabLayout 上添加的无效视图是一个 SlidingTabIndicator,所以它看起来是正确的。 另一个信息,当我从 Theme.AppCompat.Light.NoActionBar 移动到 Theme.MaterialComponents.Light.NoActionBar 作为我的应用程序的基本主题时,看起来崩溃开始了

【问题讨论】:

  • 看起来问题是在从片段退出之前它会在tabLayout.visibility = View.GONE 没有这个,它不会崩溃,但我有一个不美观的空标签布局
  • 这显然是android代码库的一个bug
  • 嘿@Perry 你解决问题了吗?
  • 我做了一个解决方法:退出页面时,如果 tabLayout 消失了,则将其设置为可见
  • 我也遇到了这个问题,并通过另一种解决方法解决了这个问题。你可以在这里查看 :) stackoverflow.com/a/68852671/2339405

标签: android navigation android-tablayout android-viewpager2


【解决方案1】:

基于给定的堆栈跟踪...

ViewPager2 does not support direct child views: 正如错误消息明确指出的那样,不要将片段直接添加到 ViewPager2。

例如,调用getFragmentManager().beginTransaction().replace 将不起作用。 如果要将Fragments添加到Viewpagers,则应使用FragmentStateAdapter

Only TabItem instances can be added to TabLayout:如错误消息所述,请确保 XML 中的 TabLayout 没有除 TabItem 之外的任何子级。

例如这是不正确的:

<android.support.design.widget.TabLayout">
     <android.support.v4.view.ViewPager /> <!-- This Viewpager should be placed somewhere else. -->
</android.support.design.widget.TabLayout>

现在这是正确的:

<android.support.design.widget.TabLayout">
  <!-- No Child allowed other than TabItem. -->
</android.support.design.widget.TabLayout>

如果您认为这不是答案,请提供更多详细信息。

如果您有任何问题,请告诉我。

【讨论】:

  • 你说得对,我没有提供足够的细节。我添加了一些信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多