2015-02-06 4 views
0

Я работаю над клонированием приложения iOS, которое использует UITabBarViewController как «главный/внешний/корень» UIViewController. Каждая из его вкладок имеет UINavigationController в качестве корня для управления стекей навигации UIViewController экземпляров.Android: приложение с вкладками с навигационными стеками

Я пытаюсь очень трудно сделать 2 вещи:

  1. REPLICATE функциональность приложения IOS.
  2. Сделайте это по-настоящему «Android» (т. Е. Не заставляя iOS-парадигму в мире, отличном от iOS).

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

В настоящее время у меня есть решение, которое «вроде» работает. Насколько я понимаю, моя текущая настройка:

  • Единый, BaseActivity класс, который расширяет ActionBarActivity.
  • Все действия в моем приложении (только 2 пока, но намечены на 5), расширяют этот класс.
  • Эта базовая деятельность загружает макет drawer.xml, который имеет android:support.v4.widget.DrawerLayout в качестве своего внешнего элемента.
  • Внутри этого является:
    • A FrameLayout, который является контейнером для моих фрагментов.
    • A ListView, который сам ящик.

Основываясь на моем тестировании приложения, эта установка получает меня больше всего то, что я хочу.

  • Когда я «перемещаюсь» (используя ящик) к другому действию, загружается правильная активность.
  • Когда я «перемещаюсь» к «более глубокому» фрагменту (через экранные элементы управления), то возвращается правильный новый фрагмент, и я переопределял onBackPressed() в BaseActivity, чтобы правильно поместить задний стек, если это необходимо.

Проблема Я сталкиваюсь это:

  1. приложение запускается и "активность 1: Фрагмент 1" отображается. Я нажимаю на элемент, чтобы перейти к «Действие 1: Фрагмент 2» (который хорошо работает).
  2. Я использую ящик для запуска Activity 2, и отображается «Activity 2: Fragment 1». Все идет нормально.
  3. Я использую выдвижной ящик, чтобы пойти вернуться к (по крайней мере, это мое намерение) к существующей деятельности 1, и отображается «Действие 1: Фрагмент 1».

Я изучил флаги запуска Activity/Intent, но я не уверен, что действительно понимаю, что происходит.До сих пор мое чтение привело меня попробовать следующие шаги:

  1. При переключении Активности, установив его флаг, как это: intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
  2. В моей AndroidManifest.xml, устанавливая активность launchMode так: android:launchMode="singleInstance", или как этот
    android:launchMode="singleTop"

Странная, дополнительная проблема, я столкнулся в том, что запуск нового процесса, кажется, не создавать активность обратно стек, как я ожидал. Когда я перехожу от Activity 1 к Activity 2 (игнорируя нехватку поддержки стоп-кадра на мгновение), нажатие кнопки «Назад» из Activity 2 закрывает приложение, что меня смущает.

Есть ли один, текущий передовой опыт для этого типа структуры приложения/навигации?

+0

«Я использую выдвижной ящик, чтобы вернуться» - что вы подразумеваете под этим? Элементы в навигационном ящике должны идти в определенное место (например, «Контакты»), а не в логическое место (например, «назад к тому месту, где вы были раньше»). «Существует ли какая-то лучшая практика для такого типа структуры приложения/навигации?» - Имейте в виду, что только подмножество людей здесь будет иметь представление о структуре iOS iOS, поскольку не все здесь - разработчик iOS. – CommonsWare

+0

@CommonsWare «Назад», как в «возврате», а не «назад», как в «вверх по стеку навигации». Кроме того, я чувствовал, что очень хорошо объяснил структуру. Это набор вкладок sibling, каждый из которых поддерживает свой собственный стек навигации, который должен поддерживаться при возврате на эту вкладку. – mbm29414

+0

«Это набор вкладок sibling, каждый из которых поддерживает свой собственный стек навигации» - вкладки обычно не используются, как вы описали в Android. – CommonsWare

ответ

0

Хороший подход состоит в том, чтобы иметь 1 активность и обрабатывать задние стеки вручную, поскольку у Android есть только 1 стек. Я делал это несколько раз, и, наконец, я создал библиотеку под названием Tab Stacker, которая выполняет задание: историю фрагментов для каждой вкладки.

Он с открытым исходным кодом и полностью задокументирован и может легко включаться с помощью градации. Вы можете найти библиотеку на GitHub: https://github.com/smart-fun/TabStacker

Вы также можете загрузить приложение образец, чтобы увидеть, что поведение соответствует вашим потребностям:

https://play.google.com/apps/testing/fr.arnaudguyon.tabstackerapp

Если у вас есть какие-либо вопросы, не стесняйтесь отказаться почта.

Смежные вопросы