FragmentContainerView不(似乎)支持pre-L设备上的共享元素转换

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

我的MainActivity具有以下布局:

<androidx.fragment.app.FragmentContainerView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/nav_host_fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:defaultNavHost="true"
    app:navGraph="@navigation/nav_graph_main"/>

其余部分在片段中。

我有两个片段,其中我用共享元素(例如列表片段和详细片段)为过渡设置了动画。

我正在将JetPack的Navigation ComponentSafeArgs插件以及AndroidX包中的转换类一起使用。

val directions = AlbumsListFragmentDirections.actionAlbumsListFragmentToAlbumDetailsFragment(
            ViewCompat.getTransitionName(binding.imageThumbnail)!!
        )

val extras = FragmentNavigatorExtras(
            binding.imageThumbnail to ViewCompat.getTransitionName(binding.imageThumbnail)!!
        )

findNavController().navigate(directions, extras)

当UI准备就绪时,我也使用postponeEnterTransition()startPostponedEnterTransition()来触发过渡动画。


在任何L +设备上,因为共享元素转换都是操作系统的本机组件,所以没有问题。

但是,在我的KitKat设备(Samsung S4)上,由于我的min API为19,当使用以下崩溃日志调用上述代码段时,应用程序崩溃:

java.lang.IllegalStateException: Views added to a FragmentContainerView must be associated with a Fragment. View androidx.transition.GhostViewApi14{42a33b30 V.ED.... ......ID 0,0-0,0} is not associated with a Fragment.
        at androidx.fragment.app.FragmentContainerView.addView(FragmentContainerView.java:276)
        at android.view.ViewGroup.addView(ViewGroup.java:3557)
        at android.view.ViewGroup.addView(ViewGroup.java:3533)
        at androidx.transition.GhostViewApi14.addGhost(GhostViewApi14.java:53)
        at androidx.transition.GhostViewUtils.addGhost(GhostViewUtils.java:30)
        at androidx.transition.ChangeTransform.createGhostView(ChangeTransform.java:391)
        at androidx.transition.ChangeTransform.createAnimator(ChangeTransform.java:272)
        at androidx.transition.Transition.createAnimators(Transition.java:744)
        at androidx.transition.TransitionSet.createAnimators(TransitionSet.java:470)
        at androidx.transition.TransitionSet.createAnimators(TransitionSet.java:470)
        at androidx.transition.TransitionSet.createAnimators(TransitionSet.java:470)
        at androidx.transition.Transition.playTransition(Transition.java:1821)
        at androidx.transition.TransitionManager$MultiListener.onPreDraw(TransitionManager.java:300)
        at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:879)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2131)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1236)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6471)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:803)
        at android.view.Choreographer.doCallbacks(Choreographer.java:603)
        at android.view.Choreographer.doFrame(Choreographer.java:573)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:789)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:157)
        at android.app.ActivityThread.main(ActivityThread.java:5356)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
        at dalvik.system.NativeStart.main(Native Method)

错误很容易理解:FragmentContainerView不支持不与片段相关联的任何视图。显然,此崩溃的根源是androidx.transition.GhostViewApi14

[通过研究该类的the source code,我了解到它是L中添加的本机视图的后向端口,以支持我相信的转换。

[我试图通过恢复到旧文件的方式来解决该问题,在XML文件中为MainActivity中声明的我的land-v19

<fragment
    android:name="androidx.navigation.fragment.NavHostFragment"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/nav_host_fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:defaultNavHost="true"
    app:navGraph="@navigation/nav_graph_main"/>

但是,该应用仍然在我的KitKat设备上崩溃。框架是否可能(可能是AppCompat-我正在使用1.1.0的稳定版本activity-ktx-1.1.0'?)自动将<fragment>替换为FragmentContainerView?之所以这样显示,是因为我删除了该XML布局,并将其内容粘贴到原始布局中。简而言之,所有版本都将通过<fragment>

使用该XML

这是一个错误吗?如果是这样,应该报告还是已知?还是我做错了?

感谢您的帮助!

android android-fragments kotlin android-animation android-transitions
1个回答
0
投票

我能够解决该特定问题,并且可以在KitKat设备上完全正常地进行转换。

[当我在Android 10(Q)设备上测试该应用程序时,我偶然发现了此issue,其中的过渡无效,但不会使该应用程序崩溃。查看日志,会发现[/ C0]的方法反射失败,因为Android 10对反射逻辑施加了限制。

我的问题也与Ghost View API

[使用该API的开发人员提供的Ghost View API,是要升级到解决该特定问题的更新的,更稳定的AndroidX Transition API版本。

在编写此答案时,最稳定的版本是solution

它解决了两个问题。问题已解决。

我很幸运在这个问题上绊倒了,哪个解决方案可以解决我的问题!

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