Навигация

Android, Старт

Простой пример, чтобы максимально быстро понять, что такое Navigation Component

Компонент Навигации используется для переходов между частями/фрагментами приложения.

Для реализации простого примера нам нужно создать несколько фрагментов.

Один из них будет основой для отображения , например, списка дел, другой - для детальной информации о деле, а третий для настроек пользователя.

Этап 1

Добавление зависимостей:

dependencies {
def nav_version = "2.5.3"

// Java language implementation
implementation "androidx.navigation:navigation-fragment:$nav_version"
implementation "androidx.navigation:navigation-ui:$nav_version"
// Kotlin
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
// Feature module Support
implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"

// Testing Navigation
androidTestImplementation "androidx.navigation:navigation-testing:$nav_version"

// Jetpack Compose Integration
implementation "androidx.navigation:navigation-compose:$nav_version"
}

Этап 2

Создание необходимых фрагментов:

Нажимаем на папку Layouts ->New ->Fragment(Blank)

Введите имя класса, например, HabbitsFragment. Автоматически создастся xml-файл Фрагмента.

Аналогично создайте фрагменты SetsFragment и DetailsFragment

Этап 3

Создания графа навигации:

Теперь необходимо добавить и настроить граф перемещения по фрагментам.

Правый клик на папку «res», New->Android Resource File. Введём имя nav_graph. В поле Resource type выберем тип Navigation.

Создастся папка Navigation с nav_graph.xml

nav_graph

Добавьте фрагменты. Протяните стрелки от одного фрагмента к другим, для создания действий-переходов.

nav_graph

Этап 4

В activity_main.xml вместо созданного по умолчанию TextView добавим

<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/nav_graph" />

Этап 5

Для демонстрации работы переходов добавим две кнопки на стартовый фрагмент. Сразу добавим надпись на эти кнопки в ресурсы res/values/strings.xml:

<string name="details">Детали</string>
<string name="sets">Настройки</string>

Теперь перейдём на стартовый фрагмент fragment_habbits.xml. Для удобства размещения элементов на нём сменим тип Layout на ConstraintLayout:

<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".HabbitsFragment"
>

И добавим две кнопки, присвоив им соответствующие айдишники и настроив отступы и ограничения:

<Button
android:id="@+id/details_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="16dp"
android:text="@string/details"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

<Button
android:id="@+id/sets_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="8dp"
android:text="@string/sets"
app:layout_constraintBottom_toTopOf="@+id/details_button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

Теперь повесим событие на клик по кнопке. Для этого перейдем в класс фрагмента HabbitsFragment.kt и удалим все лишнее. Оставим только функцию onCreateView.

Добавим свойства для кнопок:

lateinit var detailsButton: Button
lateinit var setsButton: Button

Переопределим функцию:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
detailsButton = view.findViewById(R.id.details_button)
setsButton = view.findViewById(R.id.sets_button)
detailsButton.setOnClickListener {
findNavController().navigate(R.id.action_habbitsFragment_to_detailsFragment)
}
setsButton.setOnClickListener {
findNavController().navigate(R.id.action_habbitsFragment_to_setsFragment)
}
}

Почти все готово. Теперь сменим текст на фрагментах, чтобы отличать их между собой. Для этого добавим новый строковый ресурс:

<string name="all_habits">Все привычки</string>

Теперь поменяем значение аргумента text в TextView соответственно во фрагментах fragment_habbits.xml, fragment_details.xml, fragment_sets.xml на:

android:text="@string/all_habits"

android:text="@string/details"

android:text="@string/sets"

Запустим приложение и проверим работу кнопок.

nav_graph nav_graph nav_graph