Необходим комплексный дизайн интерфейса UI (фрагменты)

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

Главный экран Введите описание изображения здесь

Область RED будет отличаться для всех остальных экранов. Он может содержать данные, подобные следующим макетам экранов:

Первая активность, загружаемая в основной контейнер Введите описание изображения здесь

Занятие 2 загружено в основной контейнер Введите описание изображения здесь

Таким образом, вы можете видеть, что в основной области могут быть загружены совершенно разные секции.

Экран 3 может быть загружен как подробный раздел при выборе любого элемента списка на экране 2 (скажем, в списке фрагментов) ИЛИ его можно загрузить в результате выбора вкладки (которая появится в LeftNavBar).

Вот как я пытаюсь его реализовать.

Шаг 1. Я создал основную деятельность со следующим XML:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:background="#9ccc" > <!-- Top Bar --> </LinearLayout> <FrameLayout android:id="@+id/mainContainer" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> <!-- main Red Container that will load other Activities --> </FrameLayout> </LinearLayout> 

mainContainer – это контейнер RED, в котором я хочу загрузить mainContainer . LeftNavBar будет добавлен в это действие как родительский LeftNavBar All.

Шаг 2 Я создал ActivityOne & ActivityTwo с двумя и тремя фрагментами в них соответственно (как показано на втором и третьем изображении).

* Шаг 3 Я пытаюсь загрузить ActivityOne в mainContainer FrameLayout главной страницы … Но я не могу добавить его.

Я попытался добавить ActivityOne в mainContainer следующим образом:

 View v = (new ActivityOne()).getWindow().getDecorView(); FrameLayout mainContainer = (FrameLayout) findViewById(R.id.mainContainer); mainContainer.addView(v); 

Но getWindow() возвращает null ….

Другая проблема возникает из-за того, что все данные поступают из удаленных служб . Поэтому, пожалуйста, также предложите, как я смогу хранить ссылки на все загруженные действия в mainContainer в некотором стеке … поэтому я могу просто перезагрузить уже загруженную Вместо создания своего нового экземпляра .. Это будет использоваться при нажатии кнопки BACK.

ИЛИ

Вместо того, чтобы загружать активность в указанный выше RED-контейнер, я должен создать две действия, каждая из которых имеет свои собственные фрагменты и LeftNavBar. Это может быть проще, чем вышеупомянутый подход. Или это может быть единственным решением …. однако я чувствую, что сохранение состояния для кнопок BACK может стать беспорядочным .. но я попытаюсь реализовать это

Что бы вы сделали, если бы вам пришлось создавать этот тип приложения? Как бы вы разработали макет интерфейса для наилучшей производительности / практики?

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

Solutions Collecting From Web of "Необходим комплексный дизайн интерфейса UI (фрагменты)"

отказ

Здесь фрагменты могут оказаться сложными. Проблема была бы простой, если у Activity 1 & 2 были одинаковые макеты, чтобы вы могли просто присоединить / отсоединить фрагменты и использовать стопку фрагмента для размотки.

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

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

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

Решение

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

  • Левая навигационная панель
  • Верхняя панель
  • 2 макета. Layout1 и layout2. Они будут содержаться в родительском макете, то есть RelativeLayout или LinearLayout, и будут содержать необходимые элементы FrameLayout для ваших фрагментов.

Пример использования вашего XML (примечание, теги немного кратки):

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:background="#9ccc" > <!-- Top Bar --> </LinearLayout> <LinearLayout android:id="@+id/layout1"> <FrameLayout android:id="@+id/listFragment" /> <FrameLayout android:id="@+id/contentFragment" /> </LinearLayout> <LinearLayout android:id="@+id/layout2"> <FrameLayout android:id="@+id/imageFragment" /> <FrameLayout android:id="@+id/boxFragment1" /> <FrameLayout android:id="@+id/boxFragment2" /> <FrameLayout android:id="@+id/boxFragment3" /> </LinearLayout> </LinearLayout> 

Основная идея заключается в том, что вы затем показываете / скрываете layout1 и layout2, т. Е. Устанавливаете android: visibility = «ушел» в зависимости от состояния вашего приложения.

Недостатками этого метода являются:

  • Использование фрагмента backstack может быть невозможно, вместо этого вам нужно будет отслеживать, где пользователь находится в потоке пользовательского интерфейса, и управлять кнопкой «Назад», чтобы показать / скрыть макет
  • Возможно, вам придется проявлять особую осторожность при прикреплении / отсоединении фрагментов, когда вы показываете / скрываете их родительское представление, чтобы уменьшить потребление ресурсов, в то время как фрагменты невидимы

Преимущества:

  • Легкая связь между фрагментами и базовым активностью, поскольку используется только 1 активность

Re [2]: проблема вложенных фрагментов

Чтобы обойти проблему «вложенных фрагментов» в нашем приложении, где (как вы правильно заметили) Fragment s не может добавить Fragment s. Я размещал один фрагмент шаблона под действием, целью которого было определить набор держателей мест для других фрагментов для привязки к. При добавлении дополнительных фрагментов к активности за этот момент я использовал шаблонный держатель места размещения шаблона +@id s для определения идентификатора «root» или родительского представления для добавляемого фрагмента.

  getSupportFragmentManager().beginTransaction().add(#someIdFromTheTemplateFrag, fragment, fragmentTag).commit(); 

Фрагмент, который я добавлял, тогда знал, где закрепить себя в текущем макете, и, конечно же, потом пошел вокруг этого веселого способа добавить его в представление. Это привело к прикреплению фрагмента к другому фрагменту, следовательно, к достижению желаемого визуального «гнездования» …