При использовании NavigationView с DrawLayout и ActionBar, jetpack предоставляет несколько мощных удобных методов для соединения всего вместе, чтобы эти элементы было легче реализовать.
Метод setupActionBarWithNavController, представленный в библиотеке NavigationUi, является методом расширения для действий, который добавляет кнопку гамбургера для открытия вашего ящика, и если вы переопределите метод onSupportNavigateUp:Boolean в своем действии для вызова метода navigateUp(drawLayout:DrawLayout, navController:NavController), этот метод изменит кнопку гамбургера на кнопку возврата и автоматически возвращается с красивой анимацией, что очень круто.
Однако похоже, что этот метод реализован следующим образом:
public static boolean navigateUp(@Nullable DrawerLayout drawerLayout,
@NonNull NavController navController) {
if (drawerLayout != null && navController.getCurrentDestination().getId()
== navController.getGraph().getStartDestination()) {
drawerLayout.openDrawer(GravityCompat.START);
return true;
} else {
return navController.navigateUp();
}
}
Как вы можете видеть здесь, этот метод имеет базовую логику:
если вы не находитесь в начальном пункте назначения навигационного графа, тогда кнопка является кнопкой возврата, в противном случае это кнопка гамбургера
Это означает, что только начальная точка назначения может открыть меню рисования с помощью кнопки панели действий, в то время как все другие места назначения имеют вместо этого кнопку возврата и должны провести пальцем, чтобы открыть меню рисования.
Почему это так? Похоже, это осознанное дизайнерское решение команды разработчиков Android. Не одобряется ли доступность кнопки гамбургера в нескольких местах назначения?
Я хотел бы иметь несколько основных веток, в которых есть гамбургер-меню, и все экраны, которые от них ветвятся, чтобы иметь кнопку «Назад». Есть ли способ реализовать несколько NavGraphs и связать их вместе в один NavigationView?
u_u
Вам удалось решить вашу проблему? Я изучил исходный код класса NavigationUI и использовал этот код для достижения нескольких мест назначения верхнего уровня. Если интересно, могу опубликовать код в качестве ответа.
Я сообщил о проблеме с использованием панели инструментов внутри фрагмента и помощника NavigationUI в ошибка 109868820.
Сотрудник Google, который помог мне, ясно указал (статья № 7):
[...] the discussions with the material design team has made it clear that the navigation drawer is a global navigation pattern that should be available everywhere
Таким образом, панель материального дизайна должна быть доступна на каждом экране, включая более глубокие, когда кнопка навигации представляет собой стрелку «вверх» (а не гамбургер). В этом случае ящик доступен только с помощью жеста смахивания, поскольку кнопка навигации перемещается вверх по стеку приложения.
Действительно (№4 в ошибке):
You'll still get the title set from the android:label in your navigation graph and proper behavior when it comes to the Up button (particularly important if you're using the DrawerLayout versions)
Таким образом, поведение, которое вы обнаружили в источнике, действительно является «правильным».
Следовательно:
Другими словами, кнопку гамбургера следует использовать только в местах назначения верхнего уровня.
К сожалению, я думаю, что многие пользователи не заметят того факта, что вы можете вытащить меню ящика без каких-либо указаний на его наличие. У нас должна быть вкладка слева, чтобы указать, что меню ящика доступно? Возможно, есть другой способ сообщить пользователю, что есть меню ящика?
Пользователи приходят в пункт назначения верхнего уровня, где обнаруживают ящик с помощью значка гамбургера. Затем они узнают, что в вашем приложении есть ящик, и открывают его одним движением пальца.
К сожалению, в настоящее время может быть только один пункт назначения верхнего уровня (пункт назначения начала), поэтому кнопка гамбургера видна только в одном фрагменте, а не во всех пунктах назначения верхнего уровня. Если я что-то не пропустил и неправильно настроил ящик на контроллере навигации.
Что значит все на высшем уровне? Там может быть только один!!! (каламбур) Насколько я понимаю, лаунчер = верхний уровень (гамбургер), все остальные экраны второго уровня (без гамбургера)
@BenoitDuffez У приложений Google много направлений на высшем уровне. Например, посмотрите на приложение Gmail. Пункты назначения верхнего уровня: Входящие, Отправленные, Черновики ... и многие другие. У всех есть значок гамбургера на панели действий. Обычно пункты назначения верхнего уровня доступны из ящика (гамбургер-меню). Их дочерние пункты назначения находятся на втором уровне (без гамбургеров).
Честная оценка. Затем я должен перефразировать «кнопку гамбургера следует использовать только в местах назначения верхнего уровня» на «... использовать для фрагментов основной, которые вам нужно будет обнаруживать во время выполнения (например, используя инструкцию switch для идентификатора)» .
Суть вопроса OP заключается в том, что комбинация компонентов «Ящик» и «Навигация» не работает должным образом, или, другими словами, вы не можете достичь более одного пункта назначения верхнего уровня. Надеюсь, они исправят это в будущих выпусках, в противном случае полезность весьма ограничена.
Да, ты прав. Я не думал об этом случае, потому что моим текущим приложениям не нужно больше одного места назначения с гамбургером. Мой ответ был скорее частью находки, чем исчерпывающим ответом.
Я тоже хотел бы это знать. Ни одно из приложений Google не работает таким образом, почему они изменили ожидаемое поведение?