Дизайн навигационных графиков

  1. Вложенные графики
  2. Глобальные действия

Компонент навигации использует график навигации для управления навигацией вашего приложения. График навигации - это файл ресурсов, который содержит все пункты назначения вашего приложения, а также логические соединения или действия , которые пользователи могут выполнять для перемещения из одного пункта назначения в другой. Вы можете управлять графиком навигации своего приложения, используя редактор навигации в Android Studio.

В этом разделе приведены рекомендации и рекомендации по разработке графиков навигации вашего приложения.

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

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

Рисунок 1: Навигационный график верхнего уровня.

Вложенные графики

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

Используя в качестве примера график навигации верхнего уровня из рисунка 1, предположим, что вы хотите, чтобы пользователь видел экран title_screen и регистрировал экраны только при первом запуске приложения. После этого информация о пользователях сохраняется, и при последующих запусках приложения вы должны выводить их прямо на экран матча . Рекомендуется установить экран соответствия в качестве начального пункта назначения графика навигации верхнего уровня и переместить экраны заголовков и регистров во вложенный график, как показано на рисунке 2:

Рекомендуется установить экран соответствия в качестве начального пункта назначения графика навигации верхнего уровня и переместить экраны заголовков и регистров во вложенный график, как показано на рисунке 2:

Рисунок 2. Граф навигации верхнего уровня теперь содержит вложенный граф.

Когда откроется экран матча, вы можете проверить, есть ли зарегистрированный пользователь. Если пользователь не зарегистрирован, вы можете перейти к экрану регистрации. Для получения дополнительной информации о сценариях условной навигации см. Условная навигация ,

Другой способ модульной структуры вашего графа - включить один график в другой через элемент <include> в родительском графе навигации. Это позволяет определить включенный график в отдельном модуле или проекте, что максимизирует возможность повторного использования.

Если ваше приложение зависит от библиотечные модули , в котором содержится навигационная диаграмма, вы можете ссылаться на эти навигационные графики, используя элемент <include>.

Основываясь на нашем примере с викторинами, предположим, что вы хотите разделить игровые части приложения на отдельный библиотечный модуль, чтобы вы могли включать экраны in_game , results_winner и game_over в несколько приложений, как показано в следующем примере:

<! - График навигации модуля приложения -> <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 "app: startDestination =" @ id / match "> <фрагмент android: id =" @ + id / match "android: name = "com.example.android.navigationsample.Match" android: label = "gment_match "> <! - Запустить график навигации внутри игровых модулей -> <action android: id =" @ + id / action_match_to_in_game_nav_graph "app: destination = "@ id / in_game_nav_graph" /> </ фрагмент> <include app: graph = "@ navigation / in_game_navigation" /> </ navigation> <! - График навигации игрового модуля -> кодировка <? xml version = "1.0" = "utf-8"?> <навигация xmlns: android = "http://schemas.android.com/apk/res/android" xmlns: app = "http://schemas.android.com/apk/res- auto "android: id =" @ + id / in_game_nav_graph "app: startDestination =" @ id / in_game "> <фрагмент android: id =" @ + id / in_game "android: name =" com.example.android.gamemodule. InGame "android: label =" Game "> <action androi d: id = "@ + id / action_in_game_to_resultsWinner" app: destination = "@ id / results_winner" /> <action android: id = "@ + id / action_in_game_to_gameOver" app: destination = "@ id / game_over" /> </ фрагмент> <фрагмент android: id = "@ + id / results_winner" android: name = "com.example.android.gamemodule.ResultsWinner"> <! - Действие назад к месту назначения, которое было запущено в этот in_game_nav_graph -> <action android : id = "@ + id / action_pop_out_of_game" app: popUpTo = "@ id / in_game_nav_graph" /> </ фрагмент> <фрагмент android: id = "@ + id / game_over" android: name = "com.example.android. gamemodule.GameOver "android: label = "gment_game_over" tools: layout = "@ layout / frag_game_over"> <! - Действие назад к месту назначения, запущенное в этом in_game_nav_graph -> <action android: id = "@ + id / action_pop_out_of_game "app: popUpTo =" @ id / in_game_nav_graph "/> </ фрагмент> </ navigation>

Вы должны включить график верхнего уровня в свой основной модуль приложения и иметь ссылку Gradle для всех модулей, содержащих навигацию, на которую вам нужно ссылаться.

Глобальные действия

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

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

<? xml version = "1.0" encoding = "utf-8"?> <navigation xmlns: android = "http://schemas.android.com/apk/res/android" xmlns: app = "http: // schemas .android.com / apk / res-auto "android: id =" @ + id / in_game_nav_graph "app: startDestination =" @ id / in_game "> <! - Действие назад к месту назначения, запущенному в этом in_game_nav_graph -> < action android: id = "@ + id / action_pop_out_of_game" app: popUpTo = "@ id / in_game_nav_graph" app: popUpToInclusive = "true" /> <фрагмент android: id = "@ + id / in_game" android: name = "com .example.android.gamemodule.InGame "android: label =" Game "> <action android: id =" @ + id / action_in_game_to_resultsWinner "app: destination =" @ id / results_winner "/> <action android: id =" @ + id / action_in_game_to_gameOver "app: destination =" @ id / game_over "/> </ фрагмент> <фрагмент android: id =" @ + id / results_winner "android: name =" com.example.android.gamemodule.ResultsWinner "/ > <фрагмент android: id = "@ + id / game_over" android: name = "com.example.android.gamemodule.GameOver" android: label = "frag_game_over" инструменты: layout = "@ layout / fragmen t_game_over "/> </ navigation>

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

График навигации игрового модуля -> кодировка <?
Utf-8"?