Зачем использовать фрагменты? [дубликат]
этот вопрос уже есть ответ здесь:
- В чем преимущество использования фрагментов в Android, а не мнения? 6 ответов
в чем преимущество использования Fragment
s над использованием пользовательских View
s, которые повторно используются в разных макетах?
на оригинальный блог введение фрагменты, С Dianne Hackborn говорит, что
[фрагменты] облегчают разработчикам написание приложений, которые могут масштабироваться через разнообразие размеры экрана, за объектами уже доступно в платформе.
и она продолжает объяснять, фрагменты в контексте создания макета планшета для приложения, которое сочетает в себе интерфейс два действия с телефонной версии одного и того же приложения.
но кажется, что то же самое повторное использование может быть достигнуто с помощью пользовательских представлений. Основное различие между фрагментами и представлениями заключается в том, что они имеют разные жизненные циклы...
The Fragment
жизненный цикл:
onAttach()
,onCreate()
,onCreateView()
,onActivityCreated()
,onStart()
,onResume()
,onPause()
,onStop()
,onDestroyView()
,onDestroy()
,onDetatch()
.
The View
жизненный цикл-это:
ctor
,onFinishInflate()
,onAttachedToWindow()
,onMeasure()
,onLayout()
,onDetatchedFromWindow()
я хотел бы услышать от разработчики с опытом написания больших приложений о том, какие преимущества (если таковые имеются) они видели в использовании фрагментов против пользовательских представлений для разделения пользовательского интерфейса на многоразовые части.
6 ответов:
главная причина в том, что фрагменты более многоразовые, чем пользовательские представления.
иногда вы не можете создать полностью инкапсулированный компонент пользовательского интерфейса, опираясь только на представления. Это потому, что есть вещи, которые вы хотели бы поместить в свой взгляд, но не можете, потому что только деятельность может справиться с ними, тем самым заставляя тесную связь между деятельностью и представлением.
вот один из таких примеров. Допустим, вы хотите создать многоразовый компонент пользовательского интерфейса, который, среди многих вещи, хотят захватить фотографию и сделать что-то с ней. Обычно вы запускаете намерение, которое запускает камеру и возвращается с захваченным изображением.
обратите внимание, что пользовательский компонент пользовательского интерфейса не может полностью инкапсулировать эту функциональность, потому что ему придется полагаться на хостинге деятельности startActivityForResult потому что представления не принимают результаты деятельности (они могут косвенно запускать намерение через контекст).
теперь, если вы хотите использовать пользовательские Компонент пользовательского интерфейса в различных действиях вы будете повторять код для действия.startActivityForResult.
фрагмент с другой стороны чисто решить эту проблему.
точно так же ваш фрагмент может вносить элементы в меню опций, что-то традиционно может делать только активность. Опять же, это может быть важно, если состояние вашего пользовательского представления диктует, что происходит в меню.
фрагмент-это гораздо больше, чем просто вид. На самом деле это может быть даже совершенно без зрения. Он может иметь все виды вещей в нем, включая AsyncTasks, различные слушатели, доступ к файлам и базам данных и так далее и так далее.
подумайте об этом как о небольшой деятельности, но вы можете иметь несколько из них на экране и работать с ними всеми, включая общение друг с другом, пока они видны.
например, вы могли бы иметь список корзины отображается в одном фрагменте и выбранная в данный момент корзина подробно в другом фрагменте. Затем вы, например, измените количество элемента в подробном представлении, и представление списка может быть уведомлено об этом и обновить общую цену в представлении списка. Вы можете полностью организовать такие взаимодействия, например, все еще имея только один из них, видимый на меньшем экране устройства.
Я рефакторинг большой бизнес-приложение (>15 мероприятий) от деятельности к фрагментам, чтобы получить хорошую поддержку планшета, и я бы никогда запустите новое приложение без фрагментов.
Обновление Февраля 2016: хотя вышесказанное все еще верно, есть сложности с фрагментами, которые заставили многих людей полностью избегать их использования. Новые модели, такие как использование подхода MVC и более мощные представления альтернатив. Как говорится .. МММ.
описание:
представьте себе активность в виде тарелки, которая держит один большой торт. Фрагмент будет представлять собой контейнер, который нарезает один и тот же торт на кусочки. Каждый срез содержит свою собственную логику (слушатели и т. д.). И в целом они почти ничем не отличаются от одного большого торта.
выгода:
когда вы тарелка не может держать большой торт. (Экран маленький) Вы можете легко использовать несколько пластин (активность), чтобы держать каждый из них без необходимости перемещать ваш логика в новой деятельности.
лучше повторного использования. У меня есть несколько случаев, когда я мог бы использовать фрагмент полностью в другом приложении. Вы можете утверждать, что пользовательское представление может сделать это тоже. Но обратитесь к пункту 1, я мог бы использовать его с несколькими строками изменений макета, но для пользовательского представления он должен найти способ подключить его как к макету, так и к коду.
Это, в некотором смысле, более OO способы организации логики пользовательского интерфейса в Android программирование. Когда у вас есть функция (например, новый раздел на экране), вы создаете новый класс фрагмента с незначительным изменением существующего класса активности. Однако если вы программируете только с активностью, вам нужно будет добавить логику и внести большие изменения в тестируемый класс.
только мои 2 цента. :)
методы жизненного цикла, вероятно, ваш самый большой намек. Если вы подумаете об этом, они тесно коррелируют с жизненным циклом activity (с некоторыми крючками в activity и views). На самом деле, в статье, которую вы связали, Хакборн говорит:
в некотором смысле вы можете думать о фрагменте как о мини-активности
Как и многие вещи в разработке/разработке программного обеспечения, существует множество способов сделать что-то. Есть много разных мест, где вы могли бы поставить свой код. Да, вы могли бы, вероятно, положить много в поле зрения, но сохранение различных проблем, разделенных в разных классах, это хорошо. Классический образец этого-MVC, и он применяется в этом сценарии. Вы не хотите, чтобы испечь слишком много логики контроллера в вашем представлении. Лучше держать его в контроллерных классах, которые являются активностью, а теперь и фрагментом. Вот почему жизненный цикл фрагмента больше похож на активность, чем на представление-это было сделано для облегчения такого рода организация.
пользовательские представления-это гораздо больше работы, чем просто использование фрагментов вместо ваших действий. если вы решите использовать действия и пользовательские представления, вам нужно создать свое пользовательское представление, а затем реализовать те же методы жизненного цикла действия в своей деятельности (очень похожий жизненный цикл используется для фрагментов).
использование фрагментов также позволяет разделить компоненты на их собственные классы (фрагменты), а не иметь слишком много логики в одном действии. Дай мне землю что с примером:
скажем, вы реализуете приложение для чтения журналов. используя фрагменты, вы можете создать фрагмент: ArticleList, который отображает список статей, и другой фрагмент: ArticleDisplay, который обрабатывает логику отображения контента. затем вы можете указать, как эти фрагменты должны взаимодействовать с помощью инструментов фрагментов, так что на телефоне вы можете использовать полноэкранную недвижимость для ArticleDisplay, а на планшете вы можете отображать фрагменты бок о бок сторона.
Если бы вы попытались сделать это с помощью Activity/custom view, у вас была бы логика для обоих фрагментов в вашей монолитной активности, вам пришлось бы написать пользовательский вид, и вам пришлось бы отлаживать этот громоздкий монстр.
фрагменты, в общем, более сложный и мощный способ написания ваших приложений. Они могут делать все, что может сделать деятельность, и даже больше. Если вам не нужна дополнительная функциональность, значения по умолчанию, вероятно, приведут вас туда, куда вам нужно идти, и с меньшим количеством работы.
Я коснулся фрагментов один раз и нашел их не очень полезными (см. этот пост). Из того, что я прочитал,фрагмент - это действительно причудливое слово для объекта с доступом к контексту активности. Мне нравится игнорировать фрагменты в своей работе, и просто создавать эти объекты самостоятельно. Я создал очень большие, очень требовательные приложения, передав
Activity
конструкторам, а неContext
. Однако одним из основных преимуществ использования фрагментов является то, что они поддерживаются макетом представления система-так что вы можете легко добавить их в Android xml (если вы используете его для ваших макетов).