Дилемма: когда использовать Fragments vs Activities:

Я знаю, что Activities предназначены для представления одного экрана моего приложения, в то время как Fragments предназначены для многократного использования макетов пользовательского интерфейса со встроенной в них логикой.

Еще недавно я разработал приложение, в котором говорилось, что они должны быть разработаны. Я создал Activity для представления экрана моего приложения и использовал фрагменты для ViewPager или Google Maps. Я редко создавал ListFragment или другой пользовательский интерфейс, который можно использовать несколько раз.

Недавно я наткнулся на проект, который содержит только 2 Activities одно - это действие SettingsActivity а другое - MainActivity. Макет MainActivity заполнен множеством скрытых фрагментов полноэкранного пользовательского интерфейса, и отображается только один. В логике Activity есть много FragmentTransitions между различными экранами приложения.

Что мне понравилось в этом подходе, так это то, что, поскольку приложение использует ActionBar, оно остается неизменным и не перемещается с анимацией переключения экрана, что происходит при переключении Activity. Это дает более плавное ощущение этих переходов экрана.

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

ОБНОВЛЕНИЕ (01.05.2014): После этой презентации Эрика Бёрка из Square (я должен сказать, что это отличная презентация с множеством полезных инструментов для разработчиков Android. И я никак не связан с Square)

http://www.infoq.com/presentations/Android-Design/

Исходя из своего личного опыта за последние несколько месяцев, я обнаружил, что лучший способ создания моих приложений - это создание групп фрагментов, которые представляют поток в приложении и представляют все эти фрагменты в одном Activity. Таким образом, в основном у вас будет такое же количество Activities в вашем приложении, что и количество потоков. Таким образом, панель действий остается неизменной на всех экранах потоков, но воссоздается при изменении потока, что имеет большой смысл. Как утверждает Эрик Берк, и, как я уже понял, философия использования как можно меньшего числа Activities не применима для всех ситуаций, потому что она создает беспорядок в том, что он называет "деятельностью Бога".

Ответ 1

Эксперты скажут вам: "Когда я увижу пользовательский интерфейс, я узнаю, следует ли использовать Activity или Fragment". В начале это не имеет никакого смысла, но со временем вы действительно сможете узнать, нужен ли вам Fragment или нет.

Есть хорошая практика, которую я нашел очень полезной для меня. Мне пришло в голову, когда я пытался что-то объяснить моей дочери.

А именно, представьте ящик, представляющий экран. Можете ли вы загрузить в этом окне другой экран? Если вы используете новый флажок, вам нужно будет скопировать несколько элементов из 1-го окна? Если ответ "Да", то вы должны использовать Fragments, потому что root Activity может содержать все дублированные элементы, чтобы сэкономить ваше время при их создании, и вы можете просто заменить части окна.

Но не забывайте, что вам всегда нужен контейнер контейнера (Activity), или ваши части будут разбросаны. Итак, одна коробка с частями внутри.

Соблюдайте осторожность при неправильном использовании коробки. Эксперты Android UX советуют (вы можете найти их на YouTube), когда мы должны явно загружать еще один Activity, вместо этого использовать Fragment (например, когда мы имеем дело с навигационным ящиком, который имеет категории). Как только вы почувствуете себя комфортно с помощью Fragments, вы сможете посмотреть все свои видео. Более того, они являются обязательным материалом.

Можете ли вы сейчас взглянуть на свой интерфейс и выяснить, нужны ли Activity или Fragment? Вы получили новую перспективу? Думаю, что да.

Ответ 2

Моя философия такова:

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

Переходы активности дорогие, верно? По крайней мере, я так считаю - поскольку старое действие должно быть уничтожено/приостановлено/остановлено, помещено в стек, а затем новое действие должно быть создано/запущено/возобновлено.

Это просто моя философия, так как фрагменты были введены.

Ответ 3

Хорошо, согласно лекциям Google (возможно здесь, я не помню), вам следует рассмотреть возможность использования Фрагменты, когда это возможно, так как это упрощает управление вашим кодом и контроль.

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

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

Я написал сообщение об этом dillema здесь, если вы хотите прочитать еще немного.

Ответ 4

Почему я предпочитаю Fragment over Activity во ВСЕХ СЛУЧАЯХ.

  • Активность стоит дорого. В Fragment представления и состояния свойств разделяются - всякий раз, когда фрагмент находится в backstack, его представления будут уничтожены. Таким образом, вы можете складывать намного больше фрагментов, чем Activity.

  • backstack. С помощью FragmentManager легко очистить все фрагменты, вставить больше, чем на фрагменты и т.д. Но для Activity это будет кошмар, чтобы манипулировать этими вещами.

  • Очень предсказуемый жизненный цикл. Пока хост-активность не перерабатывается. Фрагменты в стопке не будут переработаны. Таким образом, можно использовать FragmentManager::getFragments() для поиска определенного фрагмента (не рекомендуется).

Ответ 5

По-моему, это не очень актуально. Ключевым фактором для рассмотрения является

  • Как часто вы собираетесь повторно использовать части пользовательского интерфейса (например, меню),
  • - это приложение для планшетов?

Основное использование фрагментов - это создание многопользовательских действий, что делает его идеальным для приложений с поддержкой Tablet/Phone.

Ответ 6

Не забывайте, что активность - это блок/компонент приложения, которые могут быть разделены и запущены с помощью Intent! Поэтому каждое действие в вашем приложении должно решать только одну задачу. Если у вас есть только одна задача в вашем приложении, я думаю, вам нужно только одно действие и много фрагментов, если это необходимо. Конечно, вы можете повторно использовать фрагменты в будущих действиях, которые решают другие задачи. Этот подход будет ясным и логичным разделением задач. И вам не нужно поддерживать одно действие с различными параметрами фильтра намерения для разных наборов фрагментов. Вы определяете задачи на этапе разработки процесса разработки на основе требований.

Ответ 8

Там вам больше, чем вы понимаете, вы должны помнить, что действие, которое запускается, не подразумевает уничтожения вызывающей активности. Конечно, вы можете настроить его так, чтобы ваш пользователь нажимал кнопку, чтобы перейти на страницу, вы запускаете эту страницу и уничтожаете ее. Это вызывает много накладных расходов. Лучшее руководство, которое я могу вам дать, это:

** Начать новую деятельность только в том случае, если имеет смысл иметь основное действие, и это открывается одновременно (подумайте о нескольких окнах).

Отличным примером того, когда имеет смысл несколько действий, является Google Диск. Основное действие предоставляет файловый проводник. Когда файл открывается, для просмотра этого файла запускается новое действие. Вы можете нажать кнопку последних приложений, которая позволит вам вернуться в браузер без закрытия открытого документа, а затем, возможно, даже открыть другой документ параллельно с первым.

Ответ 9

Вещь, которую я сделал: используя меньший фрагмент, когда это возможно. К сожалению, это возможно в любом случае. Итак, у меня много фрагментов и немного действий. Некоторые недостатки, которые я понял:

  • ActionBar и меню: когда у 2 фрагмента есть другое название, меню, что  будет трудно справиться. Пример: при добавлении нового фрагмента вы можете изменить заголовок панели действий, но когда поместите его с backstack, нет способа восстановить старый заголовок. Возможно, вам понадобится панель инструментов в каждом фрагменте для этого случая, но позвольте мне поверить, что у вас будет больше времени.
  • Когда нам нужно startForResult, активность имеет только фрагмент.
  • У вас нет анимации перехода по умолчанию.

Мое решение для этого - использование Activity для обертки фрагмента внутри. Итак, у нас есть отдельная панель действий, меню, startActivityForResult, анимация,...

Ответ 10

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

Ответ 11

Вы можете использовать один из них.

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

Подумайте, как Фрагменты хранят данные мусора. Когда вы реализуете фрагмент, у вас есть корень активности для заполнения фрагментами. Итак, если вы пытаетесь реализовать множество действий со слишком большим количеством фрагментов, вам нужно учитывать производительность вашего приложения, поскольку вы манипулируете (грубо говоря) двумя жизненными циклами контекста, помните о сложности.

Помните: следует ли использовать фрагменты? Почему я не должен?

С уважением.

Ответ 12

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

if (id == R.id.forecast) {

    ForecastFragment forecastFragment = new ForecastFragment();
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.main_content, forecastFragment);
    ft.addToBackStack("backstack");
    forecastFragment.setArguments(b);
    ft.commit();
}

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

И во-вторых, я предпочитаю Фрагменты, потому что вы легко справляетесь с ними во время ротации.

Ответ 13

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

Ответ 14

Это зависит от того, что вы хотите построить на самом деле. Например, navigation drawer использует фрагменты. Вкладки также используют fragments. Другая хорошая реализация - это то, где у вас есть listview. Когда вы поворачиваете телефон и щелкаете по строке, активность отображается в оставшейся половине экрана. Лично я использую fragments и fragment dialogs, поскольку он более профессиональен. Кроме того, они легче обрабатываются во вращении.