前言
在一些不可抗力的因素下,如果一个APP只能有一个Activity,其他的页面都用fragment来展现,这个时候路由用navigation来说也很方便。但是你就必须管理好你所有页面的后退栈。
在此之前我写了一篇简单使用navigation的文章,比较粗浅,现在我对navigation又有了更深的印象,记录一下
需求
在之前fragment的添加删除操作都是用FragmentManager的事务来进行操作的,即
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container,new YourFragment())
.addToBackStack(null)
.commit();
翻一下官方的navigation文档就能发现,我们除了正常的使用一个<action>的id进行跳转以外,还能直接跳转目的地,或者在跳转的时候加入一些导航选项(navOptions)
例:直接跳转目的地mainPageFragment
NavHostFragment nav = (NavHostFragment)
getSupportFragmentManager().findFragmentById(R.id.page_host);
NavController navController = nav.getNavController();
navController.navigate(R.id.mainPageFragment);
但我们无论是直接指定目的地跳转还是用action来跳转,都会把我们跳转的路径添加到后退栈中。
举个例子,用户从A-B-C-A的顺序跳转回到A以后,用户点击返回会依次回到C-B-A的页面中,那我想在C-A的时候,用户不再回到C怎么办
解决办法
在我们的nav.xml文件中,在C-A的<action>中加入popUpTo并且把popUpToInclusive设为true
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_nav"
app:startDestination="@id/fragmentA">
<fragment
android:id="@+id/fragmentA"
android:name="com.metajoy.mynavigationdemo2.FragmentA"
android:label="FragmentA" >
<action
android:id="@+id/action_fragmentA_to_fragmentB"
app:destination="@id/fragmentB" />
</fragment>
<fragment
android:id="@+id/fragmentB"
android:name="com.metajoy.mynavigationdemo2.FragmentB"
android:label="FragmentB" >
<action
android:id="@+id/action_fragmentB_to_fragmentC"
app:destination="@id/fragmentC" />
</fragment>
<fragment
android:id="@+id/fragmentC"
android:name="com.metajoy.mynavigationdemo2.FragmentC"
android:label="FragmentC" >
<action
android:id="@+id/action_fragmentC_to_fragmentA"
app:destination="@id/fragmentA"
app:popUpTo="@id/fragmentA"
app:popUpToInclusive="true"
/>
</fragment>
</navigation>
代码方式:
NavOptions navOptions = new NavOptions.Builder()
.setPopUpTo(R.id.fragmentA,true)
.build();
view.findViewById(R.id.c_bt).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
navTo(R.id.action_fragmentC_to_fragmentA,navOptions);
//navTo(R.id.action_fragmentC_to_fragmentA);
}
});
这样就可以实现A-B-C-A,A点击返回键直接退出APP的操作了