如何在条件导航中制作片段动画

How to animate fragment animation in conditional navigation

要在导航组件中的目的地之间设置动画,可以在如下所示的 action 标记中指定以下属性。

<fragment
    .........>
    <action
        ........
        app:enterAnim="@anim/slide_in_right"
        app:exitAnim="@anim/slide_out_left"
        app:popEnterAnim="@anim/slide_in_left"
        app:popExitAnim="@anim/slide_out_right" />
</fragment>

我阅读了有关条件导航 (https://developer.android.com/guide/navigation/navigation-conditional) 的内容,它建议某些屏幕(例如登录屏幕)应独立于导航流程进行处理。

<navigation
        .........
        app:startDestination="@id/main_fragment">
    <fragment
            android:id="@+id/main_fragment"
            android:name="com.google.android.conditionalnav.MainFragment"
            android:label="fragment_main"
            tools:layout="@layout/fragment_main">
        <action
                android:id="@+id/navigate_to_profile_fragment"
                app:destination="@id/profile_fragment"/>
    </fragment>
    <fragment
            android:id="@+id/login_fragment"
            android:name="com.google.android.conditionalnav.LoginFragment"
            android:label="login_fragment"
            tools:layout="@layout/login_fragment"/>
    <fragment
            android:id="@+id/profile_fragment"
            android:name="com.google.android.conditionalnav.ProfileFragment"
            android:label="fragment_profile"
            tools:layout="@layout/fragment_profile"/>
</navigation>

我想在用户尚未通过动画验证时从 ProfileFragment 重定向到 LoginFragment。我知道我们可以在进入或退出片段时在 LoginFragment 上明确定义转换。

 class LoginFragment : Fragment() {
     override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          val inflater = TransitionInflater.from(requireContext())
          enterTransition = inflater.inflateTransition(R.transition.slide_right)
          exitTransition = inflater.inflateTransition(R.transition.fade)
     }
  }

class ProfileFragment : Fragment() {
      .......
      navController.navigate(R.id.login_fragment)
      .......
}

我想知道是否有其他方法可以使用导航组件或动画属性从 ProfileFragment 到 LoginFragment 进行动画处理,就像我们在 action 标签上使用的那样,而无需在 LoginFragment 中指定它。

如果您有一个需要多个目的地可以访问的操作(您可能希望 navigate_to_profile_fragment 操作是这样的),这正是 global actions 的用例 - 定义在<navigation> 图表级别,而不是仅与单个目的地相关联。这意味着您图表中的任何目的地都可以通过 navigate(R.id.navigate_to_profile_fragment)

触发操作
<navigation
    .........
    app:startDestination="@id/main_fragment">
    <action
        android:id="@+id/navigate_to_profile_fragment"
        app:destination="@id/profile_fragment"
        app:enterAnim="@anim/slide_in_right"
        app:exitAnim="@anim/slide_out_left"
        app:popEnterAnim="@anim/slide_in_left"
        app:popExitAnim="@anim/slide_out_right"/>
    <fragment
        android:id="@+id/main_fragment"
        android:name="com.google.android.conditionalnav.MainFragment"
        android:label="fragment_main"
        tools:layout="@layout/fragment_main">
    </fragment>
    <fragment
        android:id="@+id/login_fragment"
        android:name="com.google.android.conditionalnav.LoginFragment"
        android:label="login_fragment"
        tools:layout="@layout/login_fragment"/>
    <fragment
        android:id="@+id/profile_fragment"
        android:name="com.google.android.conditionalnav.ProfileFragment"
        android:label="fragment_profile"
        tools:layout="@layout/fragment_profile"/>
</navigation>