В чем разница между Fragment и FragmentActivity?

160

Мой вопрос, помимо очевидных различий в наследовании, каковы основные различия между Fragmentи FragmentActivity? Для каких сценариев лучше всего подходит каждый класс? Я пытаюсь понять, почему существуют оба этих класса ...

Керри
источник

Ответы:

280

A Fragmentявляется частью Activity, которая имеет:

  • свой жизненный цикл
  • получает свои входные события
  • может быть добавлен или удален во время Activityработы.

A Fragmentвсегда должен быть встроен в Activity.

Fragmentsне являются частью API до HoneyComb (3.0). Если вы хотите использовать Fragmentsприложение, ориентированное на версию платформы до HoneyComb, вам необходимо добавить пакет поддержки в ваш проект и использовать его FragmentActivityдля хранения Fragments. FragmentActivityКласс имеет API для работы с Fragments, в то время как Activityкласс, до Honeycomb, не делает.

Если ваш проект ориентирован только на HoneyComb или новее, вы должны использовать его, Activityа не FragmentActivityудерживать его Fragments.

Некоторые детали:

Используйте android.app.Fragmentс Activity. Используйте android.support.v4.app.Fragmentс FragmentActivity. Не добавляйте пакет поддержки Fragmentв, так Activityкак это вызовет исключение.

С чем следует быть осторожным, FragmentManagerи LoaderManagerиметь отдельные версии поддержки для FragmentActivity:

Если вы используете Fragmentв Activity(HoneyComb и выше), позвоните

  • getFragmentManager() получить android.app.FragmentManager
  • getLoaderManager() получить android.app.LoaderManager

если вы используете Fragmentв FragmentActivity(до HoneyComb), позвоните:

  • getSupportFragmentManager()чтобы получить android.support.v4.app.FragmentManager.
  • getSupportLoaderManager() получить android.support.v4.app.LoaderManager

так что не делай

//don't do this
myFragmentActivity.getLoaderManager(); 
//instead do this:
myFragmentActivity.getSupportLoaderManager();

или

//don't do this:
android.app.FragmentManager fm = myFragmentActivity.getSupportFragmentManager();
//instead do this:
android.support.v4.app.FragmentManager fm = myFragmentActivity.getSupportFragmentManager()

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

Гуннар Карлссон
источник
6
Однако фрагмент не обязательно должен быть частью макета действия; Вы также можете использовать фрагмент без собственного пользовательского интерфейса в качестве невидимого работника для действия.
uzay95
1
@ uzay95 спасибо за указание на это. Я добавил раздел в конце, чтобы упомянуть об этом.
Гуннар Карлссон
@GunnarKarlsson Должны ли мы добавить фрагмент к фрагменту?
Дхасним
2
@Dhasneem Вы добавляете фрагмент в FragmentActivity, если хотите, чтобы ваше приложение работало на версиях Android ниже 3.0. В противном случае вы добавляете фрагмент к действию.
Гуннар Карлссон
2
Спасибо! Это решит мою проблему! Теперь я знаю, почему мое приложение (написанное с помощью Activity) всегда падает на onCreate после добавления кнопки входа в Facebook (в их примере они используют android.support.v4.app.Fragment). Конечно, есть и другие причины аварии. Но ваш ответ - последний кусок, чтобы соединить их.
Chlind
14

FragmentActivity - это наша классическая активность с поддержкой фрагментов, не более того. Поэтому FragmentActivity необходима, когда фрагмент будет присоединен к Activity.

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

Смотрите здесь для более подробной информации

Гекхан Барыш Акер
источник
1
Кстати, устаревший ответ, который применяется только к приложениям, которые хотят работать на устройствах старше API 11.
ToolmakerSteve
@ToolmakerSteve вы можете предоставить более подробную информацию? Если возможно, можете ли вы отредактировать ответ с помощью актуальной версии?
Гекхан Барыш Акер
8

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

Если целевым дистрибутивом является Honeycomb и выше, вы можете выйти за пределы Activity.

Также фрагмент должен рассматриваться как «подвид деятельности». Он не может существовать без активности. Всегда думайте о фрагменте как о подвиде деятельности, и вы должны быть хорошими. Таким образом, действие будет родительским, а фрагмент (ы) - дочерним типом символических отношений.

j2emanue
источник
1

FragmentActivity - это специальное действие, которое содержит Fragment. В этих нескольких словах я объясню вам одно из главных важных изменений, которое с android 3.0 (HoneyComb), команда android вставила в Android SDK.

С этим новым видом концепции ваши фрагменты кода и компоновки становятся более гибкими и обслуживаемыми. Если вы ищете в Google, есть много примеров.

Симона Касагранда
источник