Я знаю, что 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
можно меньшего числа людей не применима для всех ситуаций, потому что она создает беспорядок в том, что он называет «деятельностью Бога».
Ответы:
Эксперты скажут вам: «Когда я увижу пользовательский интерфейс, я буду знать, использовать ли
Activity
илиFragment
». В начале это не будет иметь никакого смысла, но со временем вы действительно сможете сказать, если вам нужноFragment
или нет.Есть хорошая практика, которая мне очень помогла. Это произошло со мной, когда я пытался что-то объяснить моей дочери.
А именно, представьте себе коробку, которая представляет экран. Можете ли вы загрузить другой экран в этом окне? Если вы используете новый ящик, придется ли вам копировать несколько предметов из 1-го ящика? Если ответ Да, то вы должны использовать
Fragments
, потому что кореньActivity
может содержать все дублированные элементы, чтобы сэкономить ваше время на их создание, и вы можете просто заменить части коробки.Но не забывайте, что вам всегда нужен контейнер
Activity
), иначе ваши детали будут рассеяны. Итак, одна коробка с деталями внутри.Будьте осторожны, чтобы не использовать коробку неправильно. Эксперты по Android UX советуют (вы можете найти их на YouTube), когда нам следует явно загрузить другую
Activity
, вместо того, чтобы использоватьFragment
(например, когда мы имеем дело с навигационным ящиком, у которого есть категории). Как только вы почувствуете себя комфортноFragments
, вы можете посмотреть все их видео. Еще больше они являются обязательным материалом.Можете ли вы сейчас взглянуть на свой пользовательский интерфейс и выяснить, нужен ли вам
Activity
илиFragment
? Вы получили новую перспективу? Я думаю, что ты сделал.источник
Моя философия такова:
Создайте мероприятие, только если оно абсолютно необходимо. С задним стеком, доступным для фиксации множества транзакций фрагментов, я пытаюсь создать как можно меньше действий в своем приложении. Кроме того, общаться между различными фрагментами гораздо проще, чем отправлять данные туда и обратно между действиями.
Переходы активности дорогие, верно? По крайней мере, я так считаю - поскольку старое действие должно быть уничтожено / приостановлено / остановлено, помещено в стек, а затем новое действие должно быть создано / запущено / возобновлено.
Это просто моя философия, так как фрагменты были введены.
источник
onActivityResult()
безопаснее и проще, чем обратные вызовы фрагментов.Ну, согласно лекциям Google (может быть, здесь , я не помню), вы должны рассмотреть возможность использования фрагментов, когда это возможно, так как это делает ваш код легче поддерживать и контролировать.
Тем не менее, я думаю, что в некоторых случаях это может стать слишком сложным, поскольку действия, в которых размещаются фрагменты, должны перемещаться между ними.
Я думаю, вы должны решить сами, что лучше для вас. Обычно не так сложно преобразовать деятельность во фрагмент и наоборот.
Я создал пост об этой дилемме здесь , если вы хотите прочитать немного дальше.
источник
Почему я предпочитаю Fragment, а не Activity во ВСЕХ СЛУЧАЯХ.
Деятельность дорогая. В Fragment представления и состояния свойств разделены - всякий раз, когда фрагмент находится в
backstack
, его представления будут уничтожены. Таким образом, вы можете сложить гораздо больше фрагментов, чем активность.Backstack
манипуляция. С помощьюFragmentManager
него легко очистить все фрагменты, вставить больше, чем фрагменты и т. Д. Но для Деятельности это будет кошмар, чтобы манипулировать этими вещами.Очень предсказуемый жизненный цикл . Пока Хозяин Деятельность не переработан. Фрагменты в backstack не будут переработаны. Так что можно использовать,
FragmentManager::getFragments()
чтобы найти конкретный фрагмент (не рекомендуется).источник
Начиная с Jetpack , приложение Single-Activity является предпочтительной архитектурой. Особенно полезно с компонентом архитектуры навигации .
источник
источник
По моему это не очень актуально. Ключевым фактором для рассмотрения является
Основное использование фрагментов - создание многопользовательских действий, что делает его идеальным для приложений, работающих с планшетами и телефонами.
источник
Не забывайте, что действие - это блок / компонент приложения, которым можно поделиться и запустить через Intent! Таким образом, каждое действие в вашем приложении должно решать только одну задачу. Если у вас есть только одна задача в вашем приложении, я думаю, что вам нужно только одно действие и много фрагментов, если это необходимо. Конечно, вы можете повторно использовать фрагменты в будущих действиях, которые решают другие задачи. При таком подходе будет четкое и логичное разделение задач. И вам не нужно поддерживать одно действие с разными параметрами фильтра намерений для разных наборов фрагментов. Задачи определяются на этапе проектирования процесса разработки на основе требований.
источник
В этом есть нечто большее, чем вы думаете, вы должны помнить, что запущенное действие не влечет за собой уничтожение вызывающего действия. Конечно, вы можете настроить его так, чтобы ваш пользователь нажимал кнопку, чтобы перейти на страницу, вы запускали активность этой страницы и уничтожали текущую. Это вызывает много накладных расходов. Лучшее руководство, которое я могу вам дать:
** Начните новое действие только в том случае, если имеет смысл одновременно открывать основное и это действие (подумайте о нескольких окнах).
Отличным примером того, когда имеет смысл иметь несколько действий, является Google Drive. Основным видом деятельности является файловый менеджер. Когда файл открывается, запускается новая операция для просмотра этого файла. Вы можете нажать кнопку недавних приложений, которая позволит вам вернуться в браузер, не закрывая открытый документ, а затем, возможно, даже открыть другой документ параллельно первому.
источник
attach
/detach
методов.Что я и сделал: используя меньше фрагментов, когда это возможно. К сожалению, это возможно почти в любом случае. Итак, я получаю много фрагментов и немного активности. Некоторые недостатки я понял:
ActionBar
& Меню: когда 2 фрагмента имеют разные названия, меню, чтобудет трудно обрабатывать. Пример: при добавлении нового фрагмента вы можете изменить заголовок панели действий, но при его извлечении из
backstack
извлечении невозможно восстановить старый заголовок. Вам может понадобиться Панель инструментов в каждом фрагменте для этого случая, но, поверьте мне, это потратит вас больше времени.startForResult
, у активности есть, а у фрагмента нет.Мое решение для этого - использовать Activity, чтобы обернуть фрагмент внутри. Таким образом, у нас есть отдельная панель действий, меню
startActivityForResult
, анимация, ...источник
getSupportFragmentManager().addOnBackStackChangedListener
чтобы добавить слушателя. получить текущий фрагмент в этом слушателе, а затем установить заголовок и прочее.Одно большое преимущество
fragment
избыточной активности состоит в том, что код, который используется для фрагмента, может использоваться для различных действий. Таким образом, он обеспечивает возможность повторного использования кода при разработке приложений.источник
использовать одну активность для каждого приложения , чтобы обеспечить основу для
fragment
использованияfragment
на экран,fragments
являются облегченным весом , по сравнению сactivites
фрагментами являются многоразовыми фрагменты лучше подходит для приложений , которые поддерживают как телефон & таблеткуисточник
Вы можете использовать один из них.
По сути, вы должны оценить, какой из них является лучшим для вашего приложения. Подумайте, как вы будете управлять бизнес-потоком и как хранить / управлять настройками данных.
Подумайте, как фрагменты хранят данные мусора. Когда вы реализуете фрагмент, у вас есть корень активности для заполнения фрагментом (ами). Таким образом, если вы пытаетесь реализовать много действий со слишком большим количеством фрагментов, вы должны учитывать производительность своего приложения, поскольку вы управляете (грубо говоря) двумя жизненными циклами контекста, помните о сложности.
Помните: я должен использовать фрагменты? Почему я не должен?
С уважением.
источник
Я использую фрагменты для лучшего пользовательского опыта. Например, если у вас есть кнопка и вы хотите запустить, скажем, веб-сервис, когда вы нажимаете на него, я присоединяю фрагмент к родительскому действию.
Таким образом, пользователю не нужно будет переходить в другой вид деятельности.
А во-вторых, я предпочитаю фрагменты, потому что вы можете легко обращаться с ними во время вращения.
источник
Это зависит от того, что вы хотите построить на самом деле. Например
navigation drawer
использует фрагменты. Вкладки использоватьfragments
также. Еще одна хорошая реализация, где у вас естьlistview
. Когда вы поворачиваете телефон и щелкаете строку, активность отображается на оставшейся половине экрана. Лично я используюfragments
иfragment dialogs
, как это более профессионально. Кроме того, они обрабатываются легче во вращении.источник