6

有个问题困扰了我很久

在导航组件中,当使用 .navigate(int resId) 时,传递动作 ID 和片段 ID 有何不同?

例子:

<fragment android:id="@+id/loginFragment"
          android:name="com.example.myapp.ui.main.LoginFragment"
          android:label="@string/login"
          tools:layout="@layout/fragment_login" >

    <action
        android:id="@+id/action_login_to_emailLoginFragment"
        app:destination="@id/emailLoginFragment"
        app:popEnterAnim="@anim/slide_in_right"
        app:popExitAnim="@anim/slide_out_right"
        app:popUpTo="@+id/emailLoginFragment"
        app:popUpToInclusive="true"/>

</fragment>

<fragment android:id="@+id/emailLoginFragment"
          android:name="com.example.myapp.ui.main.EmailLoginFragment"
          android:label="EmailLoginFragment"
          tools:layout="@layout/fragment_login_email" />

在上述情况下,如果

1) 使用 .navigate(R.id.action_login_to_emailLoginFragment);

2) 使用 .navigate(R.id.emailLoginFragment);

而且我还有一个查询,我知道 .navigate(int resId) 将替换片段,在这种情况下如何保留前一个片段中的视图状态?

4

1 回答 1

8

操作上的所有其他属性 - 即 、popEnterAnimpopExitAnimpopUpTopopUpToInclusiveNavOptions 对象的一部分,您使用该操作 ID 时会自动应用该对象。

因此,当您使用 时navigate(R.id.emailLoginFragment),不会应用任何其他字段:您不会从后堆栈弹出任何内容,也不会应用任何动画。要复制操作提供的内容,您需要使用navigate(int, Bundle, NavOptions)方法,手动构建正确的NavOptions.

于 2019-09-07T04:45:17.587 回答