在Jetpack导航中将全局动作与多个图形结合使用

时间:2020-06-26 08:41:36

标签: android-jetpack-navigation

我使用底部导航栏创建了一个应用程序,并使用Google的高级导航示例添加了四个不同的导航图

此后,我添加了名为设置的第五张图,该图具有设置片段以及全局操作

我在前四个图的每个图上都添加了一个包含项

当我执行类似findNavController(R.id.container).navigate(SettingsDirections.showSettings())之类的操作时,由于找不到目标位置或操作,应用程序崩溃了

但是当我在每个图内复制fragment和全局图action并调用上面的代码时(具有该图的方向)

我错过了什么吗?实际不包括从另一张图中复制所有内容的原始信息吗?

2 个答案:

答案 0 :(得分:4)

似乎include标记实际上并没有包含所有的nav图,包括全局操作

所以如果有人想做类似的事情,这就是我的做法

首先,我更新了设置导航,以包含一个虚拟操作来显示如下设置:

<?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/settings"
    app:startDestination="@+id/settings_dest">

    <include app:graph="@navigation/questions" />

    <!--this is just so safeargs will create a SettingsNavigation.showSettings it is never actually used-->
    <action
        android:id="@+id/show_settings"
        app:destination="@id/settings_dest" />

    <fragment
        android:id="@+id/settings_dest"
        android:name="com.example.app.ui.fragments.SettingsFragment"
        android:label="@string/settings"
        tools:layout="@layout/fragment_settings" >

        <argument
            app:argType="com.example.app.ui.model.SettingsProfile"
            android:name="profile"
            app:nullable="false"/>
    </fragment>
</navigation>

,然后在要使用show_settings动作的每个导航图上,都将包括以下内容:

<include app:graph="@navigation/settings" />

<action
    android:id="@+id/show_settings"
    app:destination="@id/settings"
    app:enterAnim="@anim/fade_in"
    app:exitAnim="@anim/fade_out"
    app:popEnterAnim="@anim/fade_in"
    app:popExitAnim="@anim/fade_out" />

现在,当我想使用路线去设置时,我会这样

findNavController().navigate(SettingsDirections.showSettings(profile))

这将使用在我的settings.xml中创建的说明在当前的导航控制器中执行操作

重要的是,包含文件中的操作ID和包含它的文件的操作ID必须相同

答案 1 :(得分:0)

我在设置默认动画时创建了扩展功能

fun View.navigate(id: Int, navOptions: NavOptions? = null){
  var updatedNavOptions = navOptions

  if(updatedNavOptions == null){
    updatedNavOptions = navOptions {
        anim {
            enter = R.anim.slide_in_right
            exit = R.anim.slide_out_left
            popEnter = R.anim.slide_in_left
            popExit = R.anim.slide_out_right
        }
    }
}

    this.findNavController().navigate(id, null, updatedNavOptions)
}

在我的片段中,只需这样做:

my_view.click { view?.navigate(R.id.how_referral_program_works) }