Android : 导航组件中action id和fragment id的区别
Android : Difference between action id and fragment id in navigation component
有个问题困扰了我很久,
在导航组件中,当使用 .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) 将替换该片段,在这种情况下如何保留前一个片段中的视图状态?
操作的所有其他属性 - 即 popEnterAnim
、popExitAnim
、popUpTo
和 popUpToInclusive
是 NavOptions 的一部分使用该操作 ID 时自动应用的对象。
因此,当您使用 navigate(R.id.emailLoginFragment)
时,将应用其他字段的 none:您不会从返回堆栈中弹出任何内容,也不会应用任何动画。要复制操作提供的内容,您需要使用 navigate(int, Bundle, NavOptions)
method,手动构建正确的 NavOptions
.
有个问题困扰了我很久,
在导航组件中,当使用 .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) 将替换该片段,在这种情况下如何保留前一个片段中的视图状态?
操作的所有其他属性 - 即 popEnterAnim
、popExitAnim
、popUpTo
和 popUpToInclusive
是 NavOptions 的一部分使用该操作 ID 时自动应用的对象。
因此,当您使用 navigate(R.id.emailLoginFragment)
时,将应用其他字段的 none:您不会从返回堆栈中弹出任何内容,也不会应用任何动画。要复制操作提供的内容,您需要使用 navigate(int, Bundle, NavOptions)
method,手动构建正确的 NavOptions
.