【问题标题】:Using global actions with multiple graphs in jetpack navigation在喷气背包导航中使用具有多个图形的全局动作
【发布时间】:2020-11-28 05:59:53
【问题描述】:

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

之后,我添加了第五个名为 settings 的图表,其中包含设置片段和全局操作

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

当我执行findNavController(R.id.container).navigate(SettingsDirections.showSettings()) 之类的操作时,应用程序会因为找不到目的地或操作而崩溃

但是当我在每个图中复制fragment 和全局action 并调用上面的(带有该图的方向)时,它可以工作

我错过了什么吗?不包括实际复制其他图表中的所有内容?

【问题讨论】:

    标签: android-jetpack-navigation


    【解决方案1】:

    似乎包含标签实际上并未包含所有导航图,包括全局操作

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

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

    <?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相同

    【讨论】:

    • 我也使用了这个解决方案。但不知何故,我觉得很奇怪,我们必须通过向每个需要调用它的图表添加操作来这样做。全球行动就这么多。
    • 另外提一下,父导航图中action的目的地指向子导航图的id。在子导航图中,动作的目的地指向实际目的地。
    • 如果有人想做类似的事情 - 这不相似,这实际上与全局操作相反
    • 我使用了相同的解决方案,但我对它并不满意。很多重复的代码恕我直言。这真的是 Google 希望我们在拥有不同图表时使用全局操作的方式吗?
    • 这方面有什么更新吗?
    【解决方案2】:

    我在设置默认动画的时候创建了一个扩展函数

    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) }
    

    【讨论】:

    • 我不相信这能解决 OP 的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 2020-11-22
    • 1970-01-01
    相关资源
    最近更新 更多