代码之家  ›  专栏  ›  技术社区  ›  janosch

使用Android导航架构组件跨导航图进行简单导航

  •  2
  • janosch  · 技术社区  · 6 年前

    这是一个简单的导航设置示例,经过一段时间的研究,我无法使用导航组件库。

    假设我有以下屏幕: enter image description here

    顶部的粘性片段和底部的片段位于各自的导航图中,这里是main_activity.xml:

    <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <fragment
            android:id="@+id/nav_sticky_top"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            app:layout_constraintTop_toTopOf="parent"
            app:navGraph="@navigation/navigation_graph_sticky_top" />
    
        <fragment
            android:id="@+id/navigation_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:defaultNavHost="true"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintTop_toBottomOf="@id/nav_sticky_top"
            app:navGraph="@navigation/navigation_graph" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    当我按“导航到同级片段”时,它将导航到底部导航图中的同级片段,这是正确的,结果是:

    enter image description here

    这是navigation_graph.xml:

    <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/navigation_graph.xml"
        app:startDestination="@id/blankFragment1">
    
        <fragment
            android:id="@+id/blankFragment1"
            android:name="com.example.myapplication.BlankFragment1"
            android:label="fragment_blank_fragment1"
            tools:layout="@layout/fragment_blank_fragment1">
    
            <action
                android:id="@+id/action_blankFragment1_to_siblingFragment"
                app:destination="@id/siblingFragment" />
    
        </fragment>
    
        <fragment
            android:id="@+id/siblingFragment"
            android:name="com.example.myapplication.SiblingFragment"
            tools:layout="@layout/fragment_sibling_fragment" />
    
    </navigation>
    

    现在,我想实现“导航到全屏片段”按钮,它应该导航到一个全屏片段,该片段位于一个单独的第三个导航图中,并且应该位于粘性片段导航图和下面的导航图的上方。如何才能正确实现这一点?我是说 没有 一些技巧,比如将顶部导航图片段的可见性设置为GONE,将底部导航图中的导航设置为fullscreen片段。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Carson Holzheimer    5 年前

    更新:我不再推荐这种方法。对于小型应用程序,它可能对您有用,但是当我试图在托管在不同的 NavHostFragments . 我认为最简单的方法是在顶层布局中隐藏片段以允许全屏查看。您可以添加 addOnDestinationChangedListener 监听你想要全屏显示的目的地,并简单地隐藏所需的片段。

    原始答案: 我在我的应用程序中这样做,效果很好。您应该用 main_nav_graph.xml . 例如:

    <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <fragment
            android:id="@+id/main_host_fragment"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:defaultNavHost="true"
            app:navGraph="@navigation/main_nav_graph" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    然后,全屏片段的导航将如下所示:

    <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_graph.xml"
        app:startDestination="@id/main_fullscreen">
    
        <fragment
            android:id="@+id/main_fullscreen"
            android:name="com.example.myapplication.MainFullscreen" >
    
            <action
                android:id="@+id/action_main_fullscreen_to_fullscreen2"
                app:destination="@id/fullscreen2" />
    
        </fragment>
    
        <fragment
            android:id="@+id/fullscreen2"
            android:name="com.example.myapplication.Fullscreen2" />
    </navigation>
    

    其中主全屏有一个类似于您提供的ConstraintLayout的布局。你要确保 app:defaultNavHost="true" 给你所有的孩子。

    然后,当我想从blankFragment1导航到fullscreen2时,我称之为:

    Navigation.findNavController(activity!!, R.id.main_host_fragment).navigate(R.id.action_main_fullscreen_to_fullscreen2)
    

    当然,如果导航图除了在同一个活动中之外没有实际连接,那么拥有导航图就没什么意义了,但是我喜欢导航图在导航编辑器中给你的应用程序的漂亮图片:)