Нажмите "Enter", чтобы перейти к содержанию

Андроид навигатор: Навигаторы с Android. Купить навигатор с Android

Содержание

Android Studio. Kotlin. Кастомный навигатор нижнего меню. Keep state navigator / Хабр

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

Как было. Стандартный навигатор нижнего меню

Думаю стоит привести код, какой он был до внесения мной изменений и подключения кастомного навигатора. Вот так выглядел фрагмент функции onCreate в MainActivity, подключающий нижнее меню:

.. .
val navController = findNavController(R.id.nav_host_fragment)  
val navView = findViewById<BottomNavigationView>(R.id.nav_view)
navView.setupWithNavController(navController)
...

Для лучшего понимания приведу также фрагмент кода activity_main.xml, как оно было до внесенных изменений:

<fragment
        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:navGraph="@navigation/navigation_graph"/>
<com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/nav_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        app:menu="@menu/bottom_nav_menu"/>

Меню для навигатора (bottom_nav_menu) выглядело так:

<menu xmlns:android="http://schemas. android.com/apk/res/android">
    <item
        android:id="@+id/navigation_clients"
        android:icon="@drawable/ic_clients"
        android:title="@string/title_clients" />
    <item
        android:id="@+id/navigation_services"
        android:icon="@drawable/ic_timetable"
        android:title="@string/title_services" />
    <item
        android:id="@+id/navigation_expenses"
        android:icon="@drawable/ic_expenses"
        android:title="@string/title_expenses" />
    <item
        android:id="@+id/navigation_analytics"
        android:icon="@drawable/ic_analytics"
        android:title="@string/title_analytics" />
</menu>

А навигационный граф (navigation_graph) так:

<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/mobile_navigation"
    app:startDestination="@+id/navigation_clients">
    <fragment
        android:id="@+id/navigation_clients"
        android:name="ru. keytomyself.customeraccounting.fragments.ClientsFragment"
        android:label="@string/title_clients"
        tools:layout="@layout/fragment_clients" />
    <fragment
        android:id="@+id/navigation_services"
        android:name="ru.keytomyself.customeraccounting.fragments.ServiceFragment"
        android:label="@string/title_services"
        tools:layout="@layout/fragment_services" />
    <fragment
        android:id="@+id/navigation_expenses"
        android:name="ru.keytomyself.customeraccounting.fragments.ExpensesFragment"
        android:label="@string/title_expenses"
        tools:layout="@layout/fragment_expenses" />
    <fragment
        android:id="@+id/navigation_analytics"
        android:name="ru.keytomyself.customeraccounting.fragments.AnalyticsFragment"
        android:label="@string/title_analytics"
        tools:layout="@layout/fragment_analytics" />
</navigation>

Что было сделано. Подключение кастомного навигатора

1. Класс KeepStateNavigator

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

package ru.keytomyself.customeraccounting
import android.content.Context
import android.os.Bundle
import androidx.fragment.app.FragmentManager
import androidx.navigation.NavDestination
import androidx.navigation.NavOptions
import androidx.navigation.Navigator
import androidx.navigation.fragment.FragmentNavigator
@Navigator.Name("keep_state_fragment")
class KeepStateNavigator(
    private val context: Context,
    private val manager: FragmentManager,
    private val containerId: Int
) : FragmentNavigator(context, manager, containerId) {
    override fun navigate(
        destination: Destination,
        args: Bundle?,
        navOptions: NavOptions?,
        navigatorExtras: Navigator.Extras?
    ): NavDestination? {
        val tag = destination.id.toString()
        val transaction = manager.beginTransaction()
        var initialNavigate = false
        val currentFragment = manager.
primaryNavigationFragment if (currentFragment != null) { transaction.detach(currentFragment) } else { initialNavigate = true } var fragment = manager.findFragmentByTag(tag) if (fragment == null) { val className = destination.className fragment = manager.fragmentFactory.instantiate(context.classLoader, className) transaction.add(containerId, fragment, tag) } else { transaction.attach(fragment) } transaction.setPrimaryNavigationFragment(fragment) transaction.setReorderingAllowed(true) transaction.commitNow() return if (initialNavigate) { destination } else { null } } }

Обратите внимание на эту строчку кода: @Navigator.Name(«keep_state_fragment») Здесь задается название элемента навигации вместо «fragment».

2. Изменения в navigation_graph

<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/mobile_navigation" app:startDestination="@+id/navigation_clients"> <keep_state_fragment android:id="@+id/navigation_clients" android:name="ru.keytomyself.customeraccounting.fragments.ClientsFragment" android:label="@string/title_clients" tools:layout="@layout/fragment_clients" /> <keep_state_fragment android:id="@+id/navigation_services" android:name="ru.keytomyself.customeraccounting.fragments.ServiceFragment" android:label="@string/title_services" tools:layout="@layout/fragment_services" /> <keep_state_fragment android:id="@+id/navigation_expenses" android:name="ru.keytomyself.customeraccounting.fragments.ExpensesFragment" android:label="@string/title_expenses" tools:layout="@layout/fragment_expenses" /> <keep_state_fragment android:id="@+id/navigation_analytics" android:name="ru.
keytomyself.customeraccounting.fragments.AnalyticsFragment" android:label="@string/title_analytics" tools:layout="@layout/fragment_analytics" /> </navigation>

Меняю «fragment» на «keep_state_fragment», больше ничего не трогаю.

3. Изменения в функции onCreate MainActivity

...
val navController = findNavController(R.id.nav_host_fragment)
// получаем фрагмент
val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment)!!
// устанавливаем кастомный навигатор
val navigator = KeepStateNavigator(
    this,
    navHostFragment.childFragmentManager,
    R.id.nav_host_fragment
)
navController.navigatorProvider += navigator
// устанавливаем navigation graph
navController.setGraph(R.navigation.navigation_graph)
val navView = findViewById<BottomNavigationView>(R.id.nav_view)
navView.setupWithNavController(navController)
...

В этом коде стоит обратить внимание на две вещи. Во-первых, в 14 строке мы кастомный навигатор добавляем к стандартному, а не заменяем им его (navController. navigatorProvider += navigator). Во-вторых, navigation graph устанавливаем теперь в коде, а не в XML, как раньше (navController.setGraph(R.navigation.navigation_graph)).

4. Последний штрих, но без которого ничего не работает

Я уже почти отказался от использования кастомного навигатора нижнего меню в своем фрагменте из-за того, что он наотрез отказывался работать. В обязательном порядке необходимо удалить строчку «app:navGraph=»@navigation/navigation_graph»» из activity_main.xml

<fragment
        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"/>
<com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/nav_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        app:menu="@menu/bottom_nav_menu"/>

Итоги

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

Приложение над которым я сейчас работаю — Учет клиентов для самозанятых — доступно по ссылке.

android-navigation · Темы GitHub · GitHub

Вот 43 публичных репозитория соответствует этой теме…

нкапдеви / Фрагнав

Звезда 1,5к

адриелькафе / путешественник

Звезда 1,1к

тунджид / Android-расширения

Звезда 564

SmartToolFactory / NavigationComponents-Учебники

Звезда 335

каталинмирон / реакция-родной-навигация-переход

Спонсор Звезда 203

фурканаскин / TrickyNavigationSample

Звезда 149

рудикк / Гия

Звезда 120

Валерий Пономаренко / модульная навигация

Звезда 81

эсфирм / универсальный маршрутизатор

Звезда 72

zawadz88 / НавигацияКомпонентИгровая площадка

Звезда 58

сохранить население / пири

Звезда 54

лев4ик / aac-навигация-общие-элементы-переход

Звезда 34

вайбхав1929 / Android-навигационная панель

Звезда 33

акобварданян / NavigationComponentSample

Звезда 19

айкуттасил / современный андроид

Звезда 17

ФерПрието / MVVM-модульный

Звезда 13

за пределами глаза / compose_bloc

Звезда 11

umair13adil / AndroidJetpackШаблон

Звезда 11

X1nto / ПерекрытиеПанелиСоставить

Звезда 10

X1nto / Такси

Звезда 7

Улучшить эту страницу

Добавьте описание, изображение и ссылки на Android-навигация страницу темы, чтобы разработчикам было легче узнать о ней.

Курировать эту тему

Добавьте эту тему в свой репозиторий

Чтобы связать ваш репозиторий с Android-навигация тему, перейдите на целевую страницу репозитория и выберите «управление темами».

Узнать больше

Что нового — ArcGIS Navigator | Документация

Часто задаваемые вопросы

Наверх

В этой теме
  1. 22.1.0
  2. 21.0.0 (iOS)
  3. 20.0.1
  4. 19.1.1 (Android) и 19.1. 0 (iOS)

22.1.0

Версия Navigator 22.1.0 включает следующее:

  • Улучшенная поддержка локаторов, созданных в ArcGIS Pro 2.6 и более поздних версиях.
  • Различные исправления ошибок и улучшения, в том числе следующие:
    • BUG-000098681
    • BUG-000105908
    • BUG-000133413
    • BUG-000133999
    • ОШИБКА-000134512
    • ОШИБКА-000138751
    • ОШИБКА-000147200
    • ОШИБКА -000147291
    • BUG-000150483
    • BUG-000153220

21.

0.0 (iOS)

Выпуск Навигатора 21 .0.0 для iOS включает следующее:

  • Различные исправления ошибок и улучшения.

20.0.1

Версия Navigator 20.0.1 для Android и iOS включает следующее:

  • Navigator for ArcGIS переименован в ArcGIS Navigator.
  • Различные исправления ошибок и улучшения.

19.1.1 (Android) и 19.1.0 (iOS)

Выпуск Navigator 19.1.1 для Android и 19.1.0 для iOS привнесли в приложение ряд улучшений. Вы можете создавать общие маршруты и перемещаться по ним, просматривать информацию о своих активах в пакетах мобильных карт, приостанавливать навигацию, пропускать остановки и взаимодействовать с картой во время навигации. Приложение имеет обновленный внешний вид и включает поддержку встроенной проверки подлинности Windows (IWA).

Использование общих маршрутов

Мобильные работники теперь могут получать доступ к общим маршрутам. Вы можете использовать ArcGIS Online, ArcGIS Enterprise или ArcGIS Pro для создания и публикации слоев маршрутов, точно указав, куда вы хотите, чтобы мобильные работники направлялись, и убедитесь, что у них есть нужные маршруты. Вашим мобильным работникам не придется заезжать на многочисленные остановки, и они всегда будут следовать вашему плану. Если они отклонятся от курса, они будут направлены обратно на ваш общий маршрут, а не на другой маршрут, чтобы добраться до следующей остановки. Узнайте, как создавать и делиться маршруты и как их используют мобильные работники.

Просмотр информации об активах

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

Приостановить навигацию и пропустить остановки

В предыдущих версиях Navigator завершение маршрута во время навигации означало, что вы не могли возобновить маршрут. Теперь, когда вы нажимаете «Конец», маршрут приостанавливается, и вы можете просмотреть сведения о маршруте или внести изменения, если вы создали маршрут на устройстве.

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

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

Обновления пользовательского интерфейса

Навигатор имеет обновленный внешний вид. Пользовательский интерфейс был переработан с упором на упрощение и согласованность. Откройте карту, следуйте по маршруту и ​​перемещайтесь с меньшим количеством нажатий в современном интерфейсе.

Различные исправления ошибок и улучшения

В этом выпуске устранены ошибки и включены дополнительные улучшения.

Ваш комментарий будет первым

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *