Android Navigation2——深入理解Navigation

前言

在一些不可抗力的因素下,如果一个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的操作了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TDSSS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值