Вступление:
Базовый шаблон "Fragments Tutorial" выглядит примерно так:
- На планшете есть список слева, подробности справа.
- Оба они
Fragments
находятся в одном и том же местеActivity
. - На телефоне есть список
Fragment
в одномActivity
. - Запустите новый
Activity
с деталямиFragment
.
(например, API 3.0 Фрагментов Android 3.0 от Дайан Хэкборн и Руководство по API Фрагментов )
На обоих устройствах функциональность есть в Fragments
. (просто)
На планшете всего приложения 1Activity
, на телефоне их многоActivities
.
Вопросы:
- Есть ли причина разделять телефонное приложение на множество
Activities
?
Одна из проблем этого метода заключается в том, что вы дублируете много логики в основном планшете Activity
и в отдельном телефоне Activities
.
- Не будет ли проще сохранить модель 1 Activity в обоих случаях, используя одну и ту же логику включения
Fragments
и выключения (просто используя другую схему)?
Таким образом, большая часть логики находится в Fragments
самих себе, и существует только одно Activity
- меньшее дублирование кода.
Кроме того, я читал о том ActionBarSherlock
, что он лучше всего работает Fragments
вместо Activities
(но я еще не работал с ним).
Упрощены ли учебники, или я упустил что-то важное в этом подходе?
Мы успешно испробовали оба подхода в офисе, но я собираюсь начать более крупный проект и хочу сделать все как можно проще для себя.
Некоторые ссылки на связанные вопросы:
- Дилемма: когда использовать фрагменты против действий:
- Шаблоны, когда использовать переход деятельности против динамических фрагментов
- Android - мне нужны некоторые пояснения фрагментов против действий и просмотров
- Действия или фрагменты в Android?
- Проектирование взаимодействия нескольких фрагментов и действий
- Так каковы точные преимущества фрагментов в Android 3.0?
Обновления
Началось вознаграждение за вопрос - до сих пор не уверен, почему мне нужно дублировать логику приложения в активности планшета и в каждой активности телефона.
Также найдена интересная статья ребят на площади, которую стоит прочитать:
источник
onItemSelected()
метода в Деятельности. В моем "реальном" приложении у меня есть много списков и подсписков. Этот шаблон предполагает, что моя вкладка Activity должна иметьonItemSelected()
метод для обработки каждого из списков. Кроме того, в каждой деятельности телефона должна быть одинаковая логика, дублирующаяся внутри каждой из них. ИМХО, гораздо лучше поместить логику «Выбранный элемент» в каждый фрагмент - дублирования нет, и я предпочитаю такой способ структурирования кода. Я надеюсь, что это поможетОтветы:
Я согласен, что учебники очень упрощены. Они просто вводят,
Fragments
но я не согласен с предложенной моделью.Я также согласен с тем, что не стоит дублировать логику вашего приложения во многих видах деятельности (см. « Принцип СУХО» в Википедии ).
Я предпочитаю шаблон, используемый
ActionBarSherlock
приложением Fragments Demo ( скачать здесь и исходный код здесь ). Демонстрация, которая наиболее близко соответствует учебнику, упомянутому в вопросе, называется «Макет» в приложении; илиFragmentLayoutSupport
в исходном коде.В этой демонстрации логика была перемещена из
Activity
и вFragment
.TitlesFragment
Фактически содержит логику для изменения фрагментов. Таким образом, каждое действие очень просто. Дублировать многие очень простые действия, в которых нет логики внутри действий, сделать это очень просто.Поместив логику во фрагменты, нет необходимости писать код более одного раза ; он доступен независимо от того, в какую деятельность помещен фрагмент. Это делает его более мощным паттерном, чем тот, который предлагается в базовом уроке.
Другое преимущество шаблона ABS заключается в том, что вы не получаете планшетную активность, содержащую много логики, а это означает, что вы экономите память. Шаблон учебника может привести к очень большой основной деятельности в более сложном приложении; поскольку он должен обрабатывать логику всех фрагментов, которые в него помещаются в любое время.
В целом, не думайте, что вы вынуждены использовать много видов деятельности. Думайте об этом как о возможности разбить ваш код на множество фрагментов и сэкономить память при их использовании.
источник
Я думаю, что вы на правильном пути. (И да, учебники слишком упрощены).
В макете планшета вы можете использовать одну операцию и поменять местами фрагменты (в нескольких «панелях»). Находясь в макете телефона, вы можете использовать новую активность для каждого фрагмента.
Вот так:
Это может показаться дополнительной работой, но, используя несколько действий для телефонов, вы включаете базовый жизненный цикл действий и прохождение намерений. Это также позволяет фреймворку обрабатывать все анимации и задний стек.
Чтобы уменьшить код, вы можете использовать
BaseActivity
и расширять его.Так что, если у пользователя есть планшет, который вы бы использовали,
MyMultiPaneFragActivity
или что-то подобное. Это действие отвечает за управление обратными вызовами от фрагментов и маршрутизацией намерений к правильному фрагменту (например, поисковое намерение)Если у пользователя есть телефон, вы можете использовать обычную активность с очень небольшим кодом и расширять его
MyBaseSingleFragActivity
или что-то подобное. Эти действия могут быть очень простыми, 5-10 строк кода (может быть, даже меньше).Сложная часть заключается в маршрутизации намерений и еще много чего. * (Редактировать: см. Ниже).
Я думаю, что причина этого рекомендуемого способа состоит в том, чтобы сохранить память и уменьшить сложность и связь. Если вы меняете фрагменты, они
FragmentManager
сохраняют ссылку на этот фрагмент для обратного стека. Это также упрощает то, что должно быть «запущено» для пользователя. Эта настройка также разделяет представления, макет и логику в фрагменте из жизненного цикла действия. Таким образом, фрагмент может существовать в одном действии, наряду с другим фрагментом (двухпанельным), или в трехпанельном действии и т. Д.* Одним из преимуществ регулярной намеренной маршрутизации является то, что вы можете явно запускать Activity из любого места в бэк-стеке. Один пример может быть в случае результатов поиска. (MySearchResults.class).
Прочитайте здесь для получения дополнительной информации:
http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html
источник
Вот ответ Рето Мейера относительно того же самого, взятый из этого видео курса по основам Android от Udacity .
источник
В шаблоне master-detail есть два действия. Один показывает оба фрагмента на больших экранах и только «главный» фрагмент на меньших экранах. Другой показывает фрагмент «детализации» на экранах меньшего размера.
Ваша логика детализации должна быть связана с фрагментом детализации. Следовательно, нет дублирования кода, связанного с логикой детализации между действиями - операция детализации просто отображает фрагмент детализации, возможно передавая данные из
Intent
дополнительных.ActionBarSherlock не имеет ничего общего с фрагментами, чем встроенная панель действий, так как ActionBarSherlock является чисто задним портом встроенной панели действий.
источник
Ссылаясь на 1-й вопрос «Есть ли причина разделить приложение телефона на множество видов деятельности?» - Да. это просто сводится к доступному пространству, планшет предоставляет больше возможностей для разработчиков, что позволяет разработчикам размещать больше на одном экране. Android сообщает нам, что деятельность может предоставить экран . Итак, то, что вы можете сделать с одним большим экраном на планшете, это то, что, возможно, придется распределить по нескольким экранам на телефоне, потому что не хватает места для всех фрагментов.
источник