Простая навигация по графикам навигации с компонентом архитектуры навигации Android - PullRequest
0 голосов
/ 23 января 2019

Это простой пример настройки навигации, которую я не могу заставить работать с библиотекой компонентов навигации, после некоторого исследования.

Допустим, у меня есть следующий экран: 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

Это навигационный_граф.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 и навигация в нижнем навигационном графике в полноэкранный фрагмент.

1 Ответ

0 голосов
/ 11 февраля 2019

ОБНОВЛЕНИЕ: я больше не рекомендую этот подход.Для небольших приложений это может сработать для вас, но я столкнулся с трудностями при попытке передать данные между разными навигационными графами, размещенными в разных 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>

Где MainFullscreen имеет макет, подобный предоставленному вами ConstraintLayout.Просто убедитесь, что вы добавили app:defaultNavHost="true" ко всем вашим дочерним фрагментам NavHostFragments.

Затем, когда я хочу перейти от вашего blankFragment1 к полноэкранному2, я вызываю это:

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

Конечно, не так уж многоуказывают на наличие навигационных графиков, если они на самом деле не связаны, за исключением того, что они находятся в одном и том же упражнении, но мне просто нравится красивая картинка приложения, которое графики выдают в редакторе навигации:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...