如何将Android导航架构片段动画化为在旧片段上滑动?

在导航图中定义的导航操作示例中:

<action
    android:id="@+id/action_fragment1_to_fragment2"
    app:destination="@id/fragment2"
    app:enterAnim="@anim/right_slide_in"
    app:popExitAnim="@anim/left_slide_out"/>

当打开并开始从右侧滑入视图时,会立即消失(可悲)。当 关闭并开始向右滑动时,在其下方清晰可见,给人一种漂亮的堆栈弹出效果(与iOS相当)。Fragment2Fragment1Fragment2Fragment1

如何在滑入视图时保持可见?Fragment1Fragment2


答案 1

编辑:这不是最优雅的解决方案,它实际上是一个技巧,但它似乎是解决这种情况的最佳方法,直到将包括更好的方法。NavigationComponent

因此,我们可以在 的方法中增加(从 API 21 开始),使其显示在上面。translationZFragement2onViewCreatedFragment1

例:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ViewCompat.setTranslationZ(getView(), 100f);
}

正如非常好@xinaiz建议的那样,我们可以使用而不是或任何其他随机值来为片段分配比前一个更高的高度。100fgetBackstackSize()

该解决方案是由@JFrite在此线程
中提出的 FragmentTransaction动画滑入顶部
可以在那里找到更多详细信息。


答案 2

似乎您错误地使用了 而不是 .popExitAnimexitAnim

一般规则是:

  • 当您打开(推送)新屏幕并发生时enterAnimexitAnim

  • 当您弹出屏幕时,并发生popEnterAnimpopExitAnim

因此,您应该为每个过渡指定所有4个动画。
例如,我使用这些:

<action
    android:id="@+id/mainToSearch"
    app:destination="@id/searchFragment"
    app:enterAnim="@anim/slide_in_right"
    app:exitAnim="@anim/slide_out_left"
    app:popEnterAnim="@anim/slide_in_left"
    app:popExitAnim="@anim/slide_out_right" />

推荐