Рубрики
Без рубрики

Como usar el Навигационный компонент Android

Компоненты архитектуры Android – Навигационный компонент П… С тегами для начинающих, android, kotlin, java.

Проблема навигации

На протяжении многих лет Android разработчики искали способ сделать его проще навигация между fragments и activities в приложениях, которые они создали. Muchos inventaron una cantidad de classes y variantes llamadas Навигация, Базовая навигация, Менеджер навигации.

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

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

Entra en escena el Навигационный компонент для Android

В Google ввода-вывода 2018 было объявлено о создании этого компонента, чтобы иметь стандарт, на котором будут основаны приложения Android, стабильная версия этого компонента была выпущена около месяца назад, и в настоящее время есть версия 1.0, которая совместима с AppCompat и версия 2.0, которая доступна для Android Jetpack. Если вы хотите знать, что такое Android Jetpack я говорил об этом ранее в//этой статье.

Использование этого компонента основано на создании графа в котором подключены все activities и fragments вашего приложения, а также “actions”, которые позволяют переключаться с fragments.

Покажи мне код.

Чтобы начать использовать наш Navigation Component в наших проектах, вам нужно добавить следующие зависимости в наш build. gradle модуля app и проекта.

Ява:

Ява: из проекта

buildscript {
        repositories {
            google()
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.3.1'
            //Pre Jetpack
            classpath 'android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0'
            // Jetpack
            //classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.1.0-alpha01"
        }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

приложение build.gradle del modulo

 apply plugin: 'com.android.application'
//Java and Kotlin
apply plugin: 'androidx.navigation.safeargs'
//Only Kotlin
//apply plugin: "androidx.navigation.safeargs.kotlin"

android {
compileSdkVersion 28
defaultConfig {
    applicationId "com.example.navigationcomponent"
    minSdkVersion 21
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'

//Android Pre JetPack
def nav_version = "1.0.0"
implementation "android.arch.navigation:navigation-fragment:$nav_version"
// For Kotlin use navigation-fragment-ktx
implementation "android.arch.navigation:navigation-ui:$nav_version"
// For Kotlin use navigation-ui-ktx

//Android Jetpack
//    def nav_version = "2.1.0-alpha01"
//    implementation "androidx.navigation:navigation-fragment:$nav_version" // For Kotlin use navigation-fragment-ktx
//    implementation "androidx.navigation:navigation-ui:$nav_version" // For Kotlin use navigation-ui-ktx

implementation 'com.android.support:support-v4:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.support:recyclerview-v7:28.0.0'
}

Котлин:

Котлин: из проекта

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    ext.kotlin_version = '1.3.30'
    repositories {
        google()
        jcenter() 
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.1'
        //Pre Jetpack
        classpath 'android.arch.navigation:navigation-safe-args-gradle-plugin:1.0.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // Jetpack
        //classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.1.0-alpha01"
    }
}
allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
delete rootProject.buildDir
}

из проекта модуль app

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android'
//Java and Kotlin
//apply plugin: 'androidx.navigation.safeargs'
//Only Kotlin
apply plugin: "androidx.navigation.safeargs.kotlin"
android {
compileSdkVersion 28
defaultConfig {
    applicationId "com.example.navigationcomponent"
    minSdkVersion 21
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'

    //Android Pre JetPack
    def nav_version = "1.0.0"
    implementation "android.arch.navigation:navigation-fragment:$nav_version"
    // For Kotlin use navigation-fragment-ktx
    implementation "android.arch.navigation:navigation-ui:$nav_version"
    // For Kotlin use navigation-ui-ktx

    //Android Jetpack
    //def nav_version = "2.1.0-alpha01"
    //implementation "androidx.navigation:navigation-fragment:$nav_version" // For Kotlin use navigation-fragment-ktx
    //implementation "androidx.navigation:navigation-ui:$nav_version" // For Kotlin use navigation-ui-ktx

    implementation 'com.android.support:support-v4:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    }

repositories {
    mavenCentral()
}

1. Создать навигационный график el

Для этого нам нужно открыть вкладку Project в Android Studio и щелкнуть правой кнопкой мыши папку “res”, выбрать файл ресурсов Android, ввести имя навигационного графика, который мы хотим, а затем выбрать Навигацию.

2. Добавьте NavHostFragment в layout нашего MainActivity.

Это поможет нам разместить наши фрагменты. Для этого мы добавляем следующий код в наш макет.




    

Затем вам нужно открыть наш файл навигации nav_graph.xml и выберите наш хост fragment.

3. Агрегар нуэстрос фрагментирует Навигационный график

Просто нажмите на значок на экране с зеленым знаком+, затем нажмите на “Create new destination” оттуда мы можем добавить наши ранее созданные фрагменты или создать новые.

4. Подключение наших fragments с помощью actions

Чтобы подключить их, просто нажмите на fragment и “перетащите” стрелку на наш второй fragment. И мы бы уже создали акцию.

5. Перемещение между fragments

Для перемещения между fragments с помощью Navigation Component у нас есть несколько вариантов. Основным всегда является получение NavigationController, в зависимости от контекста, в котором вы находитесь, вы можете выполнить его по-другому. В нашем случае мы переключимся на другой fragment при нажатии на изображение. Для этого мы будем использовать метод класса Navigation FindNavController который принимает в качестве параметра View или Activity, затем мы используем метод navigate и передаем ему в качестве параметра идентификатор нашего action оставаясь таким образом:

Ява:

ivDog.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Navigation.findNavController(v).navigate(R.id.action_mainFragment_to_detailFragment);
        }
});

Котлин:

ivDog?.setOnClickListener {v -> Navigation.findNavController(v).navigate(R.id.action_mainFragment_to_detailFragment) }

Передача объектов из одного fragment в другой

Чтобы передать объекты из fragment, нам просто нужно создать наш Bundle, как это было традиционно, и добавить его в качестве параметра в метод. navigate (), который мы видели раньше в этой форме |//Java:

ivGorilla.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Bundle bundle = new Bundle();
            bundle.putInt("id", R.drawable.animal_2);
            Navigation.findNavController(v).navigate(R.id.action_mainFragment_to_detailFragment, bundle);
        }
    });

Котлин:

ivGorilla?.setOnClickListener { v ->
        val bundle = Bundle()
        bundle.putInt("drawable_id", R.drawable.animal_2)
        Navigation.findNavController(v).navigate(R.id.action_mainFragment_to_detailFragment, bundle)
    }

Чтобы получить drawableId в нашем фрагменте деталей, мы делаем это следующим образом:

Ява:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    if (getArguments() != null) {
        int drawableId = DetailFragmentArgs.fromBundle(getArguments()).getDrawableId();
        ivAnimal.setImageResource(drawableId);
    }
}

Котлин:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    arguments?.let{
        //Without SafeArgs
        int drawableId = getArguments().getInt("drawable_id");
        ivAnimal?.setImageResource(drawableId)
    }
}

Pasar objetos de un fragment a otro usando el plugin de safe-аргументы

Navigation Component использует плагин Gradle под названием safe-args, который помогает при передаче объектов из Fragment А в Fragment B. Это помогает генерировать классы, которые заботятся о том, чтобы объекты были type-safe.

Примечание//: Type-safe означает, что объект оценивается во время компиляции, и компилятор выдаст нам ошибку, если мы попытаемся передать тип, который ошибочен.

Кроме того, это помогает нам избавиться от проблемы назначения констант в качестве ключей bundle, чтобы затем использовать их и таким образом извлекать объекты.

Сначала нам нужно пойти в наш nav_graph.xml и нажмите на фрагмент, который получит объект, в нашем случае мы пройдем идентификатор drawable, который мы покажем в нашей детали Fragment. Итак, мы нажимаем на DetailFragment, затем на символ + справа от “Arguments” и создаем наш новый аргумент. Заполняем поля и нажимаем “Добавить”.

Нам нужно создать экземпляр объекта NavDirections, который мы получаем из класса, который был сгенерирован плагином safeArgs. Плагин safeArgs что он делает, это добавить суффикс к имени fragment, в нашем случае: Если ваш Fragment называется MainFragment, этот класс будет называться MainFragmentDirections, затем мы используем метод, который он предоставляет, и, как вы можете видеть, он имеет в качестве параметра целое число, которое это идентификатор drawable, который мы собираемся передать другому Fragment. Затем вызывается метод, который мы видели перед navigate (), но на этот раз мы передадим NavDirections, который мы создали ранее.

Ява:

   ivHorse.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            NavDirections mainFragmentDirections = MainFragmentDirections.actionMainFragmentToDetailFragment(R.drawable.animal_3);
            Navigation.findNavController(v).navigate(mainFragmentDirections);
        }
    });

Котлин:

 ivHorse?.setOnClickListener { v ->
        val mainFragmentDirections = MainFragmentDirections.actionMainFragmentToDetailFragment(R.drawable.animal_3)
        Navigation.findNavController(v).navigate(mainFragmentDirections)
    }

Чтобы получить drawableId, который мы передали в fragment из DetailFragment, мы делаем это следующим образом:

Ява:

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    if (getArguments() != null) {
        int drawableId = DetailFragmentArgs.fromBundle(getArguments()).getDrawableId();
        ivAnimal.setImageResource(drawableId);
    }
}

Котлин:

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
arguments?.let{
//Using SafeArgs
val drawableId = DetailFragmentArgs.fromBundle(it).drawableId
ivAnimal?.setImageResource(drawableId)
}
}

Окончательный

Это основное использование Navigation Component. Он также может быть использован в случае, когда вы хотите с Drawer или с Bottom Navigation View, но это дает для другой статьи 😄 . И на этом мы закончили. En los próximos articulos hablaré un poco acerca de outros Компоненты архитектуры Android. Если вам понравилась эта статья, оставьте свой ❤️ и прокомментируйте, если у вас были какие-либо сомнения по этому поводу, без комментариев seguirme в твиттере para que seamos amigos 😄 y дата уна вуэльта пор мой блог www.codingpizza.com в случае, если вы хотите узнать о других уроках Android.

Оригинал: “https://dev.to/gvetri/como-usar-el-android-navigation-component-4hhg”