Я работаю над клонированием приложения iOS, которое использует UITabBarViewController
как «главный/внешний/корень» UIViewController
. Каждая из его вкладок имеет UINavigationController
в качестве корня для управления стекей навигации UIViewController
экземпляров.Android: приложение с вкладками с навигационными стеками
Я пытаюсь очень трудно сделать 2 вещи:
- REPLICATE функциональность приложения IOS.
- Сделайте это по-настоящему «Android» (т. Е. Не заставляя iOS-парадигму в мире, отличном от iOS).
Я искал вокруг немного, но эта тема, похоже, сильно изменилась за последние несколько лет. Я попробовал решение, в котором было одно действие, которое все управляло, но это требовало поддержки отдельных стоп-пакетов и, казалось, получало большие пальцы от большинства пользователей здесь.
В настоящее время у меня есть решение, которое «вроде» работает. Насколько я понимаю, моя текущая настройка:
- Единый,
BaseActivity
класс, который расширяетActionBarActivity
. - Все действия в моем приложении (только 2 пока, но намечены на 5), расширяют этот класс.
- Эта базовая деятельность загружает макет
drawer.xml
, который имеетandroid:support.v4.widget.DrawerLayout
в качестве своего внешнего элемента. - Внутри этого является:
- A
FrameLayout
, который является контейнером для моих фрагментов. - A
ListView
, который сам ящик.
- A
Основываясь на моем тестировании приложения, эта установка получает меня больше всего то, что я хочу.
- Когда я «перемещаюсь» (используя ящик) к другому действию, загружается правильная активность.
- Когда я «перемещаюсь» к «более глубокому» фрагменту (через экранные элементы управления), то возвращается правильный новый фрагмент, и я переопределял
onBackPressed()
вBaseActivity
, чтобы правильно поместить задний стек, если это необходимо.
Проблема Я сталкиваюсь это:
- приложение запускается и "активность 1: Фрагмент 1" отображается. Я нажимаю на элемент, чтобы перейти к «Действие 1: Фрагмент 2» (который хорошо работает).
- Я использую ящик для запуска Activity 2, и отображается «Activity 2: Fragment 1». Все идет нормально.
- Я использую выдвижной ящик, чтобы пойти вернуться к (по крайней мере, это мое намерение) к существующей деятельности 1, и отображается «Действие 1: Фрагмент 1».
Я изучил флаги запуска Activity/Intent, но я не уверен, что действительно понимаю, что происходит.До сих пор мое чтение привело меня попробовать следующие шаги:
- При переключении Активности, установив его флаг, как это:
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
- В моей AndroidManifest.xml, устанавливая активность launchMode так:
android:launchMode="singleInstance"
, или как этот
android:launchMode="singleTop"
Странная, дополнительная проблема, я столкнулся в том, что запуск нового процесса, кажется, не создавать активность обратно стек, как я ожидал. Когда я перехожу от Activity 1 к Activity 2 (игнорируя нехватку поддержки стоп-кадра на мгновение), нажатие кнопки «Назад» из Activity 2 закрывает приложение, что меня смущает.
Есть ли один, текущий передовой опыт для этого типа структуры приложения/навигации?
«Я использую выдвижной ящик, чтобы вернуться» - что вы подразумеваете под этим? Элементы в навигационном ящике должны идти в определенное место (например, «Контакты»), а не в логическое место (например, «назад к тому месту, где вы были раньше»). «Существует ли какая-то лучшая практика для такого типа структуры приложения/навигации?» - Имейте в виду, что только подмножество людей здесь будет иметь представление о структуре iOS iOS, поскольку не все здесь - разработчик iOS. – CommonsWare
@CommonsWare «Назад», как в «возврате», а не «назад», как в «вверх по стеку навигации». Кроме того, я чувствовал, что очень хорошо объяснил структуру. Это набор вкладок sibling, каждый из которых поддерживает свой собственный стек навигации, который должен поддерживаться при возврате на эту вкладку. – mbm29414
«Это набор вкладок sibling, каждый из которых поддерживает свой собственный стек навигации» - вкладки обычно не используются, как вы описали в Android. – CommonsWare