是否可以在不连接 nav_graph 的情况下移动屏幕?

时间:2021-07-02 15:17:44

标签: android android-fragments android-bottomnavigationview

我正在使用底部导航。 从菜单 A 的屏幕到另一个屏幕的转换,而不是从菜单 A 到另一个屏幕的转换,如下所示。

menu A(fragment) -> B screen(fragment) -> C screen(fragment) -> B screen(fragment)

我在 nav_graph

中连接了这些屏幕转换

我正在使用 BottomNavigation。 从 menu A 的屏幕到另一个屏幕的转换,而不是从菜单 A 到另一个的屏幕转换,如下所示。

菜单 A(片段) -> B 画面(片段) -> C 画面(片段) -> D 画面(片段)

我在 nav_graph

中连接了这些屏幕转换

然而,从DC的屏幕转换没有连接,但是可以使用view.findNavController.navigate()来切换屏幕。

我认为不连接到 nav_graph 就不可能转换屏幕。

这怎么可能?

更新

nav_graph.xml

<?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/nav_graph"
    app:startDestination="@id/calendar">
    <fragment
        android:id="@+id/calendar"
        android:name="com.example.writeweight.fragment.CalendarFragment"
        android:label="fragment_calendar"
        tools:layout="@layout/fragment_calendar" >
    </fragment>
    <fragment
        android:id="@+id/list"
        android:name="com.example.writeweight.fragment.WorkoutListFragment"
        android:label="fragment_workout_list"
        tools:layout="@layout/fragment_workout_list" />
    <!-- menu A fragment -->
    <fragment
        android:id="@+id/write_home"
        android:name="com.example.writeweight.fragment.WriteRoutineHomeFragment"
        android:label="fragment_write_routine_home"
        tools:layout="@layout/fragment_write_routine_home" >
        <action
            android:id="@+id/action_write_home_to_bodyPartDialog"
            app:destination="@id/bodyPartDialog" />
    </fragment>
    
    <!-- B screen -->
    <dialog
        android:id="@+id/bodyPartDialog"
        android:name="com.example.writeweight.fragment.BodyPartDialogFragment"
        android:label="BodyPartDialogFragment"
        tools:layout="@layout/fragment_body_part_dialog">
        <action
            android:id="@+id/action_bodyPartDialog_to_write"
            app:destination="@id/write"/>
    </dialog>
    
    <!-- C screen -->
    <fragment
        android:id="@+id/write"
        android:name="com.example.writeweight.fragment.WritingRoutineFragment"
        android:label="WritingRoutineFragment"
        tools:layout="@layout/fragment_writing_routine">
        <action
            android:id="@+id/action_write_to_bodyPartDialog"
            app:destination="@id/bodyPartDialog" />
        <argument
            android:name="title"
            app:argType="string"
            android:defaultValue="" />
    </fragment>
    
    <!-- D screen   -->
    <fragment
        android:id="@+id/workoutListTabFragment"
        android:name="com.example.writeweight.fragment.WorkoutListTabFragment"
        android:label="fragment_workout_list_tab"
        tools:layout="@layout/fragment_workout_list_tab" />
</navigation>

1 个答案:

答案 0 :(得分:2)

根据Navigate using ID documentation

<块引用>

navigate(int) 获取操作或目标的资源 ID。

因此,可以直接导航到任何目的地(通过使用目的地的 ID),也支持通过操作进行导航。

文档继续说:

<块引用>

注意:使用 ID 导航时,我们强烈建议您尽可能使用操作。操作在您的导航图中提供额外信息,直观地显示您的目的地如何相互连接。通过创建操作,您可以用 Safe Args-generated operations 替换资源 ID,从而提供额外的编译时安全性。通过使用动作,您还可以为目标之间的过渡设置动画。有关详细信息,请参阅 Animate transitions between destinations