我的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 Component
与SafeArgs
插件以及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>
这是一个错误吗?如果是这样,应该报告还是已知?还是我做错了?
感谢您的帮助!
我能够解决该特定问题,并且可以在KitKat设备上完全正常地进行转换。
[当我在Android 10(Q)设备上测试该应用程序时,我偶然发现了此issue,其中的过渡无效,但不会使该应用程序崩溃。查看日志,会发现[/ C0]的方法反射失败,因为Android 10对反射逻辑施加了限制。
我的问题也与Ghost View API
。
[使用该API的开发人员提供的Ghost View API
,是要升级到解决该特定问题的更新的,更稳定的AndroidX Transition API版本。
在编写此答案时,最稳定的版本是solution。
它解决了两个问题。问题已解决。
我很幸运在这个问题上绊倒了,哪个解决方案可以解决我的问题!