Сколько действий против фрагментов?
Введение:
В базовом шаблоне "Fragments Tutorial" есть что-то вроде этого:
- На планшете, у вас есть список слева, подробности справа.
- Оба являются
Fragments
и оба находятся в одном и том же Activity
.
- На телефоне,
list
Fragment
в одном Activity
.
- Запустите новый
Activity
с информацией Fragment
.
(например, Android Fragments API от Dianne Hackborn и API фрагментов Руководство)
На обоих устройствах функциональность находится в Fragments
. (Простой)
На Tablet все приложение 1 Activity
, на телефоне, есть many Activities
.
Вопросы:
- Есть ли причина разделить телефонное приложение на многие
Activities
?
Одна из проблем с этим методом заключается в том, что вы дублируете много логики в основной таблице Activity
и в отдельном телефоне Activities
.
- Не было бы проще сохранить 1 модель действия в обоих случаях,
используя ту же логику переключения
Fragments
в и из (только с использованием другого макета)?
Таким образом, большая часть логики находится в самой Fragments
, и существует только одно Activity
- меньшее дублирование кода.
И то, что я прочитал о ActionBarSherlock
, состоит в том, что он лучше работает с Fragments
вместо Activities
(но я еще не работал с ним).
Упрощены ли учебные пособия или я пропустил что-то важное в этом подходе?
Мы успешно использовали оба подхода в офисе - но я собираюсь начать крупный проект и хочу сделать все как можно проще для себя, насколько это возможно.
Некоторые ссылки на связанные вопросы:
Обновление
Начните щедрость на вопрос - все еще не убежден в том, почему мне нужно дублировать свою логику приложения в моей активности на планшете и в каждой активности телефона.
Также была найдена интересная статья парней на площади, которая стоит прочитать:
Ответы
Ответ 1
Я согласен с тем, что учебники очень упрощены. Они просто вводят Fragments
, но я не согласен с шаблоном, как было предложено.
Я также согласен с тем, что не рекомендуется дублировать вашу логику приложений во многих видах деятельности (см. DRY Принцип по википедии).
Я предпочитаю шаблон, используемый в приложении ActionBarSherlock
Fragments Demo (скачать здесь и исходный код здесь). Демонстрация, которая наиболее точно соответствует учебнику, упомянутому в вопросе, - это тот, который называется "Макет" в приложении; или FragmentLayoutSupport
в исходном коде.
В этой демонстрации логика была перенесена из Activity
и в Fragment
. TitlesFragment
фактически содержит логику изменения фрагментов. Таким образом, каждая операция очень проста. Чтобы дублировать многие очень простые действия, в которых ни одна из логических элементов внутри "Деяний" не делает этого очень простым.
Поместив логику во Фрагменты, не нужно писать код более одного раза; он доступен независимо от того, в какую область действия находится Фрагмент. Это делает его более мощным, чем тот, который предлагается основным учебником.
/**
* Helper function to show the details of a selected item, either by
* displaying a fragment in-place in the current UI, or starting a
* whole new activity in which it is displayed.
*/
void showDetails(int index)
{
mCurCheckPosition = index;
if (mDualPane)
{
// We can display everything in-place with fragments, so update
// the list to highlight the selected item and show the data.
getListView().setItemChecked(index, true);
// Check what fragment is currently shown, replace if needed.
DetailsFragment details = (DetailsFragment) getFragmentManager()
.findFragmentById(R.id.details);
if (details == null || details.getShownIndex() != index)
{
// Make new fragment to show this selection.
details = DetailsFragment.newInstance(index);
// Execute a transaction, replacing any existing fragment
// with this one inside the frame.
FragmentTransaction ft = getFragmentManager()
.beginTransaction();
ft.replace(R.id.details, details);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
}
}
else
{
// Otherwise we need to launch a new activity to display
// the dialog fragment with selected text.
Intent intent = new Intent();
intent.setClass(getActivity(), DetailsActivity.class);
intent.putExtra("index", index);
startActivity(intent);
}
}
Другим преимуществом шаблона ABS является то, что вы не получаете активность в Tablet Activity, содержащую много логики, а это означает, что вы сохраняете Память. Шаблон учебника может привести к очень большой основной деятельности в более сложном приложении; так как он должен обрабатывать логику всех фрагментов, которые будут помещены в нее в любое время.
В целом, не думайте об этом, поскольку вынуждены использовать многие виды деятельности. Подумайте об этом как о возможности разделить ваш код на многие фрагменты и сохранить память при их использовании.
Ответ 2
Я думаю, ты на правильном пути. (И да, учебники слишком упрощены).
В макете планшета вы можете использовать одно действие и свопировать и выгружать фрагменты (в нескольких "панелях" ). В макете телефона вы можете использовать новую активность для каждого фрагмента.
Так же:
![enter image description here]()
Это может показаться большим количеством дополнительной работы, но, используя несколько действий для телефонов, вы включаете базовый цикл жизненного цикла и Intent. Это также позволяет фреймворку обрабатывать все анимации и back-stack.
Чтобы уменьшить код, вы можете использовать BaseActivity
и расширить его.
Итак, если у пользователя есть планшет, вы бы использовали MyMultiPaneFragActivity
или что-то подобное. Эта деятельность отвечает за управление обратными вызовами от фрагментов и намерений маршрутизации до правильного фрагмента (например, намерение поиска)
Если у пользователя есть телефон, вы можете использовать обычное действие с очень маленьким кодом и расширять его MyBaseSingleFragActivity
или что-то подобное. Эти действия могут быть очень простыми, 5-10 строк кода (возможно, даже меньше).
Сложная часть - это намерения и многое другое. * (Изменить: см. Ниже).
Я думаю, причина в том, что это рекомендуемый способ - сохранить память и уменьшить сложность и сцепление. Если вы обмениваете фрагменты, FragmentManager
поддерживает ссылку на этот фрагмент для back-stack. Это также упрощает то, что должно быть "запущено" для пользователя. Эта настройка также отделяет представления, макет и логику в Фрагменте от жизненного цикла активности. Таким образом, фрагмент может существовать в одном действии вместе с другим фрагментом (двухслойным) или в трехпанельной активности и т.д.
* Одним из преимуществ регулярной маршрутизации намерений является то, что вы можете запускать Activity явно из любого места в back-stack. Один пример может быть в случае результатов поиска. (MySearchResults.class).
Прочитайте здесь больше:
http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html
Это может быть немного более актуальная работа, потому что каждый фрагмент должен хорошо работать в разных действиях, но обычно он окупается. Это означает, что вы можете использовать альтернативные файлы макета, которые определяют разные комбинации фрагментов, сохраняют фрагментарный код модульным, упрощают управление панелью действий и позволяют системе обрабатывать все работы заднего стека.
Ответ 3
Вот ответ Reto Meier относительно того же, взятого из это видео Основы Основы Android Основы.
Существует несколько причин, по которым вам было бы лучше разорвать ваше приложение в различные виды деятельности.
- Наличие единой монолитной активности увеличивает сложность вашего кода, что затрудняет чтение, тестирование и поддержку.
- Делает более сложным создание и управление фильтрами намерений.
- Увеличивает риск жесткой связи независимых компонентов.
- Повышает вероятность возникновения рисков безопасности, если одно действие включает в себя как конфиденциальную информацию, так и информацию, которую можно разделить.
Хорошим правилом является создание нового действия при изменении контекста. Например, отображение различных типов данных и при переключении с просмотра на ввод данных.
Ответ 4
Одна из проблем с этим методом заключается в том, что вы дублируете много логики в основной деятельности Tablet и в отдельных действиях телефона.
В шаблоне master-detail есть два действия. Один показывает оба фрагмента на больших экранах и только "главный" фрагмент на меньших экранах. Другой показывает фрагмент детали на меньших экранах.
Ваша детальная логика должна быть связана с фрагментом детали. Следовательно, нет дублирования кода, связанного с детальной логикой между действиями - активность детали просто отображает фрагмент детали, возможно, передавая данные из Intent
extra.
И то, что я прочитал о ActionBarSherlock, заключается в том, что он лучше всего работает с Fragments вместо Activity (но я еще не работал с ним).
ActionBarSherlock больше не имеет отношения к фрагментам, чем собственно панель действий, так как ActionBarSherlock является исключительно резервной копией собственной панели действий.
Ответ 5
Ссылаясь на первый вопрос "Есть ли причина разделить телефонное приложение на многие виды деятельности?" - Да. он просто сводится к доступному пространству, планшет дает больше возможностей для разработчиков, что позволяет разработчикам размещать больше на одном экране.
Android сообщает нам, что Действия могут предоставлять экран. Итак, что вы можете сделать с одним большим экраном на планшете, это то, что, возможно, придется распространять на нескольких экранах на телефоне, потому что не хватает места для всех фрагментов.
Ответ 6
https://medium.com/@ankurpratik/android-civil-war-activity-vs-fragment-9bf9c06a7a05
Хорошая статья, чтобы понять, когда использовать фрагмент или активность в Android