вложенную навигацию Автооткрытие предыдущего экран при команде «Назад» Возможность добавить анимацию смены экранов Передача аргументов Возможность перестраивать навигацию в рантайме Поддержка Shared element Открытие и закрытие цепочки экранов 2 3 4 5 6 7 8 Приоритет 1 9 Удобный механизм работы с deeplink Возможность имплементации на Activity, Fragment, View Тестирование навигации Гибкость при изменениях Возможность навигации из бизнес-логики Возможность подменять экраны в навигационном стеке Проверка аргументов во время компиляции Визуальное представление для проектирования 10 Приоритет 2 11 12 13 14 15 16
LIFO Кнопки Back и Up работают одинаково* Диплинки в приложение порождают стек экранов, аналогичный тому, если бы мы дошли до экрана самостоятельно Постулаты 1 2 = 1 2 3
вложенную навигацию Автооткрытие предыдущего экран при команде «Назад» Возможность добавить анимацию смены экранов Передача аргументов Возможность перестраивать навигацию в рантайме Поддержка Shared element Открытие и закрытие цепочки экранов 2 3 4 5 6 7 8 Приоритет 1 9 Удобный механизм работы с deeplink Возможность имплементации на Activity, Fragment, View Тестирование навигации Гибкость при изменениях Возможность навигации из бизнес-логики Возможность подменять экраны в навигационном стеке Проверка аргументов во время компиляции Визуальное представление для проектирования 10 Приоритет 2 11 12 13 14 15 16 14
вложенную навигацию Автооткрытие предыдущего экран при команде «Назад» Возможность добавить анимацию смены экранов Передача аргументов Возможность перестраивать навигацию в рантайме Поддержка Shared element Открытие и закрытие цепочки экранов 2 3 4 5 6 7 8 Приоритет 1 9 Удобный механизм работы с deeplink Возможность имплементации на Activity, Fragment, View Тестирование навигации Гибкость при изменениях Возможность навигации из бизнес-логики Возможность подменять экраны, в навигационном стеке Проверка аргументов во время компиляции Визуальное представление для проектирования 10 Приоритет 2 11 12 13 14 16 6 4 15 14 15 12 15 16
вперед(navigate) и назад ( popBackStack / navigateUp() ) состояния NavController • Предоставляет возможность наблюдать за навигацией • Умеет сохранять состояние в Bundle и восстанавливать его обратно
вперед(navigate) и назад ( popBackStack / navigateUp() ) состояния NavController • Предоставляет возможность наблюдать за навигацией • Умеет сохранять состояние в Bundle и восстанавливать его обратно
actions */ public class NavOptions { static final int LAUNCH_SINGLE_TOP = 0x1; static final int LAUNCH_DOCUMENT = 0x2; static final int LAUNCH_CLEAR_TASK = 0x4; private int mLaunchMode; @IdRes private int mPopUpTo; private boolean mPopUpToInclusive; @AnimRes @AnimatorRes private int mEnterAnim; @AnimRes @AnimatorRes private int mExitAnim; @AnimRes @AnimatorRes private int mPopEnterAnim; @AnimRes @AnimatorRes private int mPopExitAnim; /** some code**/ }
val destination = FragmentNavigator.Destination(navigatorProvider) destination.id = NOTIFICATION_DETAILS_ID destination.setFragmentClass(NotificationDetailsFragment::class.java) // Добавляем Destination в граф graph.addDestination(destination) // Добавляем Action на открытие добавленного Destination val notificationDestination = graph.findNode(R.id.notificationFragment) notificationDestination?.putAction(OPEN_NOTIFICATION_DETAILS_ACTION_ID, NOTIFICATION_DETAILS_ID) } Задание графа из кода Корректировка
вложенную навигацию Автооткрытие предыдущего экран при команде «Назад» Возможность добавить анимацию смены экранов Передача аргументов Возможность перестраивать навигацию в рантайме Поддержка Shared element Открытие и закрытие цепочки экранов 2 3 4 5 7 8 Приоритет 1 6 6 9 Удобный механизм работы с deeplink Возможность имплементации на Activity, Fragment, View Тестирование навигации Гибкость при изменениях Возможность навигации из бизнес-логики Возможность подменять экраны, в навигационном стеке Проверка аргументов во время компиляции Визуальное представление для проектирования 10 Приоритет 2 11 12 13 14 15 16 6 4 14 15 16 15 12
вложенную навигацию Автооткрытие предыдущего экран при команде «Назад» Возможность добавить анимацию смены экранов Передача аргументов Возможность перестраивать навигацию в рантайме Поддержка Shared element Открытие и закрытие цепочки экранов 2 3 4 5 6 7 8 Приоритет 1 6 9 Удобный механизм работы с deeplink Возможность имплементации на Activity, Fragment, View Тестирование навигации Гибкость при изменениях Возможность навигации из бизнес-логики Возможность подменять экраны, в навигационном стеке Проверка аргументов во время компиляции Визуальное представление для проектирования 10 Приоритет 2 11 12 13 14 15 16 6 4 14 15 16 15 12 10
android:defaultValue="1" app:argType="integer" /> </fragment> val introFragmentArgs: IntroFragmentArgs = IntroFragmentArgs .Builder() .setAmount(3) .build() val introFragmentDirection: NavDirections = HomeFragmentDirections .actionHomeFragmentToIntroFragment() .setAmount(3) // Навигация при помощи Args navController.navigate(R.id.introFragment, introFragmentArgs.toBundle()) // Навигация при помощи Direction navController.navigate(introFragmentDirection)
вложенную навигацию Автооткрытие предыдущего экран при команде «Назад» Возможность добавить анимацию смены экранов Передача аргументов Возможность перестраивать навигацию в рантайме Поддержка Shared element Открытие и закрытие цепочки экранов 2 3 4 5 6 7 8 Приоритет 1 6 9 Удобный механизм работы с deeplink Возможность имплементации на Activity, Fragment, View Тестирование навигации Гибкость при изменениях Возможность навигации из бизнес-логики Возможность подменять экраны, в навигационном стеке Проверка аргументов во время компиляции Визуальное представление для проектирования 10 Приоритет 2 11 12 13 14 15 16 6 5 6 4 14 15 16 15 12 10
вложенную навигацию Автооткрытие предыдущего экран при команде «Назад» Возможность добавить анимацию смены экранов Передача аргументов Возможность перестраивать навигацию в рантайме Поддержка Shared element Открытие и закрытие цепочки экранов 2 3 4 5 6 7 8 Приоритет 1 6 9 Удобный механизм работы с deeplink Возможность имплементации на Activity, Fragment, View Тестирование навигации Гибкость при изменениях Возможность навигации из бизнес-логики Возможность подменять экраны, в навигационном стеке Проверка аргументов во время компиляции Визуальное представление для проектирования 10 Приоритет 2 11 12 13 16 6 5 15 15 14 6 4 14 15 16 15 12 10
to map a View from a removed or hidden * Fragment to a View from a shown or added Fragment. * <var>sharedElement</var> must have a unique transitionName in the View hierarchy. * * @param sharedElement A View in a disappearing Fragment to match with a View in an * appearing Fragment. * @param name The transitionName for a View in an appearing Fragment to match to the shared * element. * @see Fragment#setSharedElementReturnTransition(Object) * @see Fragment#setSharedElementEnterTransition(Object) */ @NonNull public abstract FragmentTransaction addSharedElement(@NonNull View sharedElement, @NonNull String name);
вложенную навигацию Автооткрытие предыдущего экран при команде «Назад» Возможность добавить анимацию смены экранов Передача аргументов Возможность перестраивать навигацию в рантайме Поддержка Shared element Открытие и закрытие цепочки экранов 2 3 4 5 6 7 8 Приоритет 1 6 9 Удобный механизм работы с deeplink Возможность имплементации на Activity, Fragment, View Тестирование навигации Гибкость при изменениях Возможность навигации из бизнес-логики Возможность подменять экраны, в навигационном стеке Проверка аргументов во время компиляции Визуальное представление для проектирования 10 Приоритет 2 11 12 13 14 15 16 6 5 7 6 4 14 15 15 15 16 15 12 10
вложенную навигацию Автооткрытие предыдущего экран при команде «Назад» Возможность добавить анимацию смены экранов Передача аргументов Возможность перестраивать навигацию в рантайме Поддержка Shared element Открытие и закрытие цепочки экранов 2 3 4 5 6 7 8 Приоритет 1 6 9 Удобный механизм работы с deeplink Возможность имплементации на Activity, Fragment, View Тестирование навигации Гибкость при изменениях Возможность навигации из бизнес-логики Возможность подменять экраны, в навигационном стеке Проверка аргументов во время компиляции Визуальное представление для проектирования 10 Приоритет 2 11 12 13 14 16 6 5 7 6 4 6 2 15 15 14 15 16 15 12 10 6 3
вложенную навигацию Автооткрытие предыдущего экран при команде «Назад» Возможность добавить анимацию смены экранов Передача аргументов Возможность перестраивать навигацию в рантайме Поддержка Shared element Открытие и закрытие цепочки экранов 2 3 4 5 6 7 8 Приоритет 1 6 9 Удобный механизм работы с deeplink Возможность имплементации на Activity, Fragment, View Тестирование навигации Гибкость при изменениях Возможность навигации из бизнес-логики Возможность подменять экраны, в навигационном стеке Проверка аргументов во время компиляции Визуальное представление для проектирования 10 Приоритет 2 11 12 13 14 16 6 5 7 6 4 6 2 6 1 6 3 15 15 14 15 16 15 12 10
transition described by the navigation command * * @param commands the navigation command array to apply * per single transaction */ void applyCommands(Command[] commands); } public interface Navigator { /** * Navigation command describes screens transition. * that can be processed by {@link ru.terrakok.cicerone.Navigator}. */ public interface Command {} }
вложенную навигацию Автооткрытие предыдущего экран при команде «Назад» Возможность добавить анимацию смены экранов Передача аргументов Возможность перестраивать навигацию в рантайме Поддержка Shared element Открытие и закрытие цепочки экранов 2 3 4 5 6 7 Приоритет 1 6 9 Удобный механизм работы с deeplink Возможность имплементации на Activity, Fragment, View Тестирование навигации Гибкость при изменениях Возможность навигации из бизнес-логики Возможность подменять экраны, в навигационном стеке Проверка аргументов во время компиляции Визуальное представление для проектирования 10 Приоритет 2 11 12 13 14 16 6 5 7 6 4 6 2 6 1 6 3 15 15 8 8 14 15 16 15 12 10 13
deepLinkBuilder.setDestination(R.id.introFragment) // для аргументов deepLinkBuilder.setArguments(Bundle()) // если задаем без NavController c NavDeepLinkBuilder(@NonNull Context context) deepLinkBuilder.setGraph(R.navigation.nav_graph) val createPendingIntent = deepLinkBuilder.createPendingIntent() Notifier.createNotificationChannel(baseContext) Notifier.notify(createPendingIntent, Notifier.HOME_DESTINATION_NOTIFICATION_ID, baseContext) } Способ задания
if (!mBackStack.isEmpty()) { navigate(mGraph.getStartDestination(), bundle, new NavOptions.Builder() .setPopUpTo(mGraph.getId(), true) .setEnterAnim(0).setExitAnim(0).build()); } int index = 0; while (index < deepLink.length) { int destinationId = deepLink[index++]; NavDestination node = findDestination(destinationId); if (node == null) { throw new IllegalStateException("unknown destination during deep link: " + NavDestination.getDisplayName(mContext, destinationId)); } node.navigate(bundle, new NavOptions.Builder().setEnterAnim(0).setExitAnim(0).build()); } /* some code*/ } Способ работы
вложенную навигацию Автооткрытие предыдущего экран при команде «Назад» Возможность добавить анимацию смены экранов Передача аргументов Возможность перестраивать навигацию в рантайме Поддержка Shared element Открытие и закрытие цепочки экранов 2 3 4 5 6 7 Приоритет 1 6 9 Удобный механизм работы с deeplink Возможность имплементации на Activity, Fragment, View Тестирование навигации Гибкость при изменениях Возможность навигации из бизнес-логики Возможность подменять экраны, в навигационном стеке Проверка аргументов во время компиляции Визуальное представление для проектирования 10 Приоритет 2 11 12 13 14 16 6 5 7 6 4 6 2 6 1 6 3 15 15 8 8 14 15 16 15 12 9 10 13
вложенную навигацию Автооткрытие предыдущего экран при команде «Назад» Возможность добавить анимацию смены экранов Передача аргументов Возможность перестраивать навигацию в рантайме Поддержка Shared element Открытие и закрытие цепочки экранов 2 3 4 5 6 7 Приоритет 1 6 9 Удобный механизм работы с deeplink Возможность имплементации на Activity, Fragment, View Тестирование навигации Гибкость при изменениях Возможность навигации из бизнес-логики Возможность подменять экраны, в навигационном стеке Проверка аргументов во время компиляции Визуальное представление для проектирования 10 Приоритет 2 11 12 13 14 16 6 5 7 6 4 6 2 6 1 6 3 15 15 8 8 14 11 15 16 15 12 9 10 13
2018 August 10, 2018 July 19, 2018 July 12, 2018 June 7, 2018 New Library: Navigation Navigation provides a framework for building in-app navigation. This initial release is 1.0.0-alpha01. 1.0.0-alpha02 • FragmentNavigator now uses setReorderingAllowed(true) • NavDeepLink fixes • Lifecycle fixes • Support Library 27.1.1 • Nested graph and fragment fixes • Overlapping Fragments launchSingleTop issue fixes. • NavigationUI and MenuItem fixes • Deprecated clearTask , launchDocument 1.0.0-alpha03 • A NavigationUI supports Toolbar and CollapsingToolbarLayout • Safe Args types and nullability fixes • Safe Args plugin in modules and other plugin fixes • Lifecycle behavior changes and fixes • Nested graphs fixes • Logic and memory leak fixes • NavHostFragment will always set the current Fragment as the primary navigation fragment, ensuring that child fragment managers are popped before the outer NavController is popped • Fixed conflicts with ConstraintLayout and Ko • Safe Args error message clickable • Safe Args types and nullability fixes • back after deep linking issue fix • Backstack behavior fixes • Safe Arg fixes • Add missing nullability annotations. 1.0.0-alpha04 1.0.0-alpha05 1.0.0-alpha01 Timeline изменений
готова для продакшена Для полной навигации нужны надстройки Решение для “Быстрого старта” Копайте исходники — это захватывающе 3% 8% 12% 69% 8% Что это? Слышал, не пробовал Смотрел в эдиторе Использую в своём петпроджекте Использую в живом проект Кто работал с новой навигацией от Google?