首页 > 解决方案 > Android导航组件弹出过渡问题

问题描述

我有 2 个动作

行动1

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

行动2

<action
        android:id="@+id/actionIntroAskLocationToLogin"
        app:destination="@id/loginFragment"
        app:enterAnim="@anim/slide_in_right"
        app:exitAnim="@anim/slide_out_left"
        app:popEnterAnim="@anim/slide_in_right"
        app:popExitAnim="@anim/fade_out"
        app:popUpTo="@+id/app_main_navigation" />

我想要的是当第二个动作被触发时,我想清除后台堆栈并仅设置 loginFragment 以保留在堆栈中。

只有一个问题是当我执行 Action2 时,“slide_out_right”作为退出动画执行

我知道如果我们从堆栈中弹出片段,将触发 action1 的“popExitAnim”而不是 action2 的“exitAnim”。

但我想知道如何让片段执行 slide_out_left 动画以退出并将其从堆栈中弹出。

标签: androidandroid-architecture-componentsandroid-navigationandroid-architecture-navigation

解决方案


我最终覆盖onCreateAnimation了调用navigate. 这个例子展示了如何通过 ID 导航嵌套的导航图并有条件地替换弹出退出动画(或popExitAnim)。

override fun onCreateAnimation(transit: Int, enter: Boolean, nextAnim: Int): Animation? {
    val navController = findNavController()
    val graph = navController.graph.findNode(R.id.onboardingGraph) as NavGraph
    val dest = graph.findNode(R.id.confirmationFragment)
    if (!enter && dest != null && navController.currentDestination?.id == dest.id) {
        return AnimationUtils.loadAnimation(requireContext(), R.anim.slide_out_left)
    }
    return super.onCreateAnimation(transit, enter, nextAnim)
}

请注意,这种特殊情况部分是由于幻灯片动画的方向性。


推荐阅读