如何使用新的导航架构组件在导航中禁用某些片段?

Lou*_*sai 13 android android-architecture-components

我正在尝试新的导航架构组件,我无法弄清楚如何做到这一点:

我有1个活动(MainActivity)+ 3个碎片:

  • SplashFragment(主页)
  • MainFragment
  • SignUpFragment

我想使用SplashFragment来确定我是否应该导航到MainFragment或SignUpFragment,但是一旦它到达那两个中的任何一个,你就不应该回弹到SplashFragment.我怎么能用新的导航组件做到这一点?

popBackStack在调用之前和之后尝试过navigate(R.id.action_xxx),但是它们都没有工作(这有意义:在它没有任何东西可以弹出之前;它只是关闭刚刚添加的片段).这是否意味着唯一的方法是覆盖onBackPress拦截它并确保navigateUp在这些情况下不会调用?

谢谢!

Sub*_*haw 14

首先,添加属性app:popUpTo='your_nav_graph_id'并添加app:popUpToInclusive="true"到操作标签。

<fragment
    android:id="@+id/signInFragment"
    android:name="com.glee.incog2.android.fragment.SignInFragment"
    android:label="fragment_sign_in"
    tools:layout="@layout/fragment_sign_in" >
    <action
        android:id="@+id/action_signInFragment_to_usersFragment"
        app:destination="@id/usersFragment"
        app:launchSingleTop="true"
        app:popUpTo="@+id/main_nav_graph"
        app:popUpToInclusive="true" />
</fragment>
Run Code Online (Sandbox Code Playgroud)

其次,使用上述操作作为参数导航到目的地。

findNavController(fragment).navigate(SignInFragmentDirections.actionSignInFragmentToUserNameFragment())
Run Code Online (Sandbox Code Playgroud)

注意:如果使用方法导航navigate(@IdRes int resId),则不会获得期望的结果。因此,我使用了method navigate(@NonNull NavDirections directions)

  • 为那些像我一样困惑的人澄清一下 - 如果 `popUpToInclusive` 设置为 true,`popUpTo` 的意思是“删除此片段之前的所有内容”,这意味着“删除此片段及其之前的所有内容”还要确保使用 * 的 id *action** 导航时,而不是您要导航到的片段的 id。 (9认同)
  • 注意:您需要将 Navigation Component Safe Args 插件添加到您的项目中,以便生成第 2 步中的 *Directions 类。 (3认同)
  • 它与后退按钮一起使用,但向上导航按钮在 MainFragment 中可见,单击向上按钮,导航到splashFragment。如何解决这个问题呢? (2认同)

Lou*_*sai 7

警告:clearTask已弃用,将在以后的版本中删除,不确定解决方案是什么.请关注此问题,以便及时了解最新信息


哦,10分钟后终于找到了关键:使用clearTask.

我所要做的就是添加app:clearTask="true"到特定的操作或使用.navigate(R.id.actionXXXX, null, NavOptions.Builder().setClearTask(true).build()),并且已经完成.只需确保将其添加到SplashFragment的所有子项(在本例中为MainFragment和SignUpFragment).


Aki*_*kii 6

这在alpha05版本中对我有用。在操作标签中(在nav_graph.xml文件内部)添加app:popUpTo =“ @ id / nav_graph”。这里的“ @ id / nav_graph是我的图的ID,也称为根”。

<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/nav_graph"
app:startDestination="@id/startFragment">
.......
<action
android:id="@+id/action_startFragment_to_homeFragment"
app:destination="@id/homeFragment" 
app:popUpTo="@id/nav_graph"/>
.......
Run Code Online (Sandbox Code Playgroud)

您也可以在设计标签中执行此操作:-选择“ SplashFragment”,然后选择要更改的操作,然后为“ Pop To”选择“ root”