Краткое руководство по навигации

Привет, я нашел время поделиться этими небольшими знаниями об Android Studio, так как я чувствовал, что информации об этом не так много, следует отметить, что здесь есть официальная документация, я пытаюсь объяснить, как это сделать. Мне бы хотелось, чтобы кто-нибудь объяснил мне, мы увидим следующие темы:

  • Создайте новый проект Android Studio.
  • Добавление необходимых зависимостей
  • Краткое объяснение График навигации
  • Как перейти от одной судьбы вашего приложения к другой

Чтобы понять некоторые вещи, вам понадобятся базовые знания об Android Studio, но не волнуйтесь, я объясню шаг за шагом.

Пойдем!

Создание нового проекта

Откройте Android Studio и нажмите Создать › Новый проект › Базовые представления.

Название нашего проекта будет: Курс навигационного графика, затем мы нажимаем «Готово».

Файлы для этого примера

Выполнение предыдущего шага создаст для вас несколько файлов, давайте опишем их:

Внутри папки вашего пакета:

  • ПервыйФрагмент.kt
  • MainActivity.kt
  • MainFragment.kt
  • ВторойФрагмент.kt

Внутри папки res/layout:

  • Activity_main.xml
  • content_main.xml — мы удалим этот и создадим другой под названием: fragment_main.xml, я объясню, как это сделать позже в этом посте.
  • фрагмент_первый.xml
  • фрагмент_секунды.xml

Давайте отредактируем некоторые файлы, скопируем и вставим содержимое каждого файла:

activity_main.xmlсодержимое:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragmentContainerView"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>

Давайте создадим новый фрагмент под названием fragment_main.xml:.

Выполните следующие действия:

  • Щелкните правой кнопкой мыши в пакете Java New › Fragment › Blank.
  • Появится диалоговое окно, затем мы пишем это в поле имени: MainFragment, и в имя файла макета, которое мы используем: фрагмент_main.xml.
  • Нажмите «Готово» и вперед!

fragment_main.xmlсодержимое:

<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <Button
        android:id="@+id/go_to_first_fragment"
        android:text="Go to first fragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/go_to_second_fragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Go to second fragment"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/go_to_first_fragment"
        app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>

Содержимое fragment_first.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".FirstFragment">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="16dp">

        <Button
            android:id="@+id/back_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            android:text="Back"
            app:layout_constraintBottom_toTopOf="@id/textview_first"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/textview_first"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:textSize="24sp"
            android:text="First fragment, you made it!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/back_button" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>

fragment_ Second.xmlсодержимое:

<?xml version="1.0" encoding="utf-8"?>
<androidx.core.widget.NestedScrollView 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SecondFragment">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="16dp">

        <Button
            android:id="@+id/back_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            android:text="Back"
            app:layout_constraintBottom_toTopOf="@id/textview_second"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/textview_second"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:textSize="24sp"
            android:text="Second fragment, You made it!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/back_button" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>

Теперь перейдем к файлам Kotlin:

ВАЖНОЕ ПРИМЕЧАНИЕ.При копировании и вставке имейте в виду, что имя вашего пакета может отличаться от того, которое мы используем в этих примерах, поэтому замените com.aletorres.navigationgraphcourse на свое правильное. имя пакета.

MainActivity.kt: Основное действие экрана, содержимое:

package com.aletorres.navigationgraphcourse

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.WindowCompat
import com.aletorres.navigationgraphcourse.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        WindowCompat.setDecorFitsSystemWindows(window, false)
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }
}

MainFragment.kt: этот файл связан с файлом макета: fragment_main.xml, мы создали его на предыдущем шаге, содержимое:

package com.aletorres.navigationgraphcourse

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.findNavController
import com.aletorres.navigationgraphcourse.databinding.FragmentMainBinding

class MainFragment : Fragment() {
    private lateinit var binding: FragmentMainBinding

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentMainBinding.inflate(inflater, container, false)
        binding.goToFirstFragment.setOnClickListener{
            findNavController().navigate(R.id.action_mainFragment_to_FirstFragment) // This function makes possible the navigation
        }
        binding.goToSecondFragment.setOnClickListener {
            findNavController().navigate(R.id.action_mainFragment_to_SecondFragment) // This function makes possible the navigation
        }
        return binding.root
    }
}

FirstFragment.kt: этот файл связан с файлом макета: fragment_first.xml, content:

package com.aletorres.navigationgraphcourse

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.findNavController
import com.aletorres.navigationgraphcourse.databinding.FragmentFirstBinding

class FirstFragment : Fragment() {

    private lateinit var binding: FragmentFirstBinding

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentFirstBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.backButton.setOnClickListener {
            findNavController().navigate(R.id.action_FirstFragment_to_mainFragment) // This function makes possible the navigation
        }
    }
}

SecondFragment.kt:этот файл связан с файлом макета:фрагмент_секунды.xml, контент:

package com.aletorres.navigationgraphcourse

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.findNavController
import com.aletorres.navigationgraphcourse.databinding.FragmentSecondBinding

class SecondFragment : Fragment() {

    private lateinit var binding: FragmentSecondBinding

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        binding = FragmentSecondBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        binding.backButton.setOnClickListener {
            findNavController().navigate(R.id.action_SecondFragment_to_mainFragment) // This function makes possible the navigation
        }
    }
}

Вот и все с файлами

Настройте свою среду

Пожалуйста, давайте включим поддержку навигации в ваш проект. Давайте скопируем этот код в ваш файл app/build.gradle:

dependencies {

  implementation 'androidx.core:core-ktx:1.8.0'
  implementation 'androidx.appcompat:appcompat:1.6.1'
  implementation 'com.google.android.material:material:1.5.0'
  implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
  implementation 'androidx.navigation:navigation-fragment-ktx:2.7.0'
  implementation 'androidx.navigation:navigation-ui-ktx:2.7.0'
  testImplementation 'junit:junit:4.13.2'
  androidTestImplementation 'androidx.test.ext:junit:1.1.5'
  androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'

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

Таким образом мы гарантируем наличие необходимых зависимостей.

ВАЖНОЕ ПРИМЕЧАНИЕ. После этого шага синхронизируйте зависимости проекта.

Навигационный график

Навигация происходит между судьбами приложения, эти судьбы связаны действиями.

Навигационный график – это файл, содержащий все ваши судьбы и действия.

Немного теории, прежде чем продолжить:

Что такое судьба?

Это может быть представление вашего приложения, например: фрагмент, содержащий вашу логику для входа в ваше приложение, или страницу приветствия, или панель управления и т. д.

Что такое действие?

Это логические связи между вашими пунктами назначения, они представляют путь, по которому пользователи могут идти в вашем приложении.

Версия навигационного графа

При создании нового проекта файл с именем nav_graph, расположенный в папке res/navigation, был создан с помощью базового шаблона активности представлений, перейдем к файлу nav_graph.xml .

Перейдем к местоположению файла nav_graph.xml. Дважды щелкните этот файл левой кнопкой мыши, после этого мы должны оказаться на экране навигационного графика, нажмите Новое место назначения и выберите наш три фрагмента один за другим:

  • ГлавныйФрагмент
  • ПервыйФрагмент
  • ВторойФрагмент

Давайте последуем этому графическому примеру, чтобы создать наши судьбы и действия:

Теперь, на последнем этапе, давайте посмотрим на результат выполнения всего этого шаг за шагом, запустив наше приложение в Android Studio.

Результат

Вероятно, мы пропустили какой-то предыдущий шаг (дерьмо случается, хе-хе), на случай, если я сделал репозиторий только для этого примера графа навигации, там вы найдете весь исходный код, который используется для этого поста.

https://github.com/IIalejoII/navigation-graph-course

Спасибо за ваше время!

Скоро думаю выложить это как видео

Мой канал на YouTube: @aletorres1102