Фрагмент или опорный фрагмент?

125

Я разрабатываю приложение, поддерживающее Android> = 4.0. Он использует фрагменты из android.appпакета. Поскольку я сталкиваюсь с проблемами со старой реализацией фрагмента в 4.0, подобной этой , которая уже исправлена ​​в библиотеке поддержки, я рассматриваю возможность вернуться к реализации фрагмента из библиотеки поддержки, чтобы получить более надежную и последовательную реализацию.

Каково ваше мнение по этому поводу? Используете ли вы фрагменты из библиотеки поддержки, даже если они уже доступны, при разработке для Android 4?

brillenheini
источник
2
Это хороший вопрос (+1, потому что мне любопытно). К тому же в сети нет хорошего объяснения этому. Я использую библиотеку поддержки для своего приложения, и мне интересно, ошибаюсь я или нет, потому что я не заметил никаких ошибок при компиляции или во время тестирования.
JJ86
2
@animuson Ответ brillenheini доказывает, что это не основанный на мнении ответ.
OneWorld

Ответы:

90

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

Итак, мой ответ на мой собственный вопрос: при разработке для Android 4.x использование фрагментов из библиотеки поддержки - хорошая идея. В библиотеке поддержки исправлены ошибки, которые все еще присутствуют в более старых реализациях фрагментов, и часто обновляется дополнительными исправлениями ошибок.

brillenheini
источник
11
Так в чем же тогда цель android.app.Fragment? Если вы можете добавить это к своему ответу здесь с дополнительными пояснениями, я был бы полностью удовлетворен. Спасибо!
jonstaff
1
@jonstaff Причина, вероятно, историческая. Пожалуйста, посмотрите мой обновленный ответ там.
brillenheini
11
Для полноты картины, похоже, есть вещи, которые не могут выполнять фрагменты поддержки (например , анимацияobjectAnimator , даже если фактическая целевая ОС поддерживает это). Что, в случае, если вы используете ViewPager, означает, что вам нужно использовать адаптеры из библиотеки поддержки v13, иначе у вас не может быть одновременно окна просмотра и анимации переворачивания.
GSerg
5
Также будьте осторожны, по состоянию на август 2014 года библиотека v13 не может выполнять вложенные фрагменты.
Martin Marconcini
1
Почему ребята из Google выбрали использование библиотеки v13 для приложения iosched github.com/google/iosched/blob/master/android/src/main/java/com/… , у них должна быть какая-то причина
forcewill
40

Одна из серьезных причин придерживаться этого SupportFragmentна некоторое время заключается в том, что у вас нет доступа к ChildFragmentManagerAPI-интерфейсу до 17. Библиотека поддержки предоставит вам версию поддержки менеджера дочерних фрагментов.

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

Росс Хэмбрик
источник
21

Я также расстраивался из-за необходимости включать библиотеки поддержки, несмотря на ориентацию на Android 4.0+, но, похоже, это официально рекомендуется:

Пакет Android Support Library содержит несколько библиотек, которые можно включить в ваше приложение. Каждая из этих библиотек поддерживает определенный диапазон версий платформы Android и набор функций.

В этом руководстве объясняются важные функции и поддержка версий, предоставляемые библиотеками поддержки, чтобы помочь вам решить, какие из них следует включить в свое приложение. В общем, мы рекомендуем включить поддержку v4 и библиотеки appcompat v7, поскольку они поддерживают широкий спектр версий Android и предоставляют API для рекомендуемых шаблонов пользовательского интерфейса.

http://developer.android.com/tools/support-library/features.html

sourabhj
источник
Это должен быть принятый ответ, несмотря на то, что @brillenheini предоставил ответ сам. Он отвечает на вопрос с максимальной точностью и лаконичностью.
Арвинд Мани,
4

IMHO, если вы планируете разрабатывать только для 4.0, я бы порекомендовал использовать собственные библиотеки, поскольку исполняемый файл станет меньше. Это правда, что вы можете столкнуться с проблемами ошибок в ранних версиях, но я думаю, что большинство из них должно быть довольно тривиально, чтобы их можно было обойти. Также предполагается, что библиотека совместимости сопоставляется с собственными фрагментами, если вы все равно используете 4.0 и выше. Так что вам все равно придется бороться с подобными проблемами. Проблема с библиотеками поддержки заключается в том, что многие классы появляются дважды (один раз в структуре пакета поддержки и один раз в «собственной» структуре пакета), что делает разработку немного более громоздкой.

Однако, если вы хотите также выпустить свое приложение до версии 4.0, тогда нет возможности обойтись без библиотеки поддержки. Кроме того, поскольку около 38% всех пользователей используют 2.3, может иметь смысл включить эту версию ОС. В таком случае вы можете использовать библиотеку поддержки в сочетании с Jake Wartons ActionBarSherlock (или с библиотекой ActionBar, поддерживающей Google, после ее окончательного выпуска).

КаВ
источник
3
Спасибо за Ваш ответ. Поскольку мне нужен ViewPager, я все равно должен включить библиотеку поддержки. Кроме того, фрагмент поддержки не пытается переключиться на собственную реализацию, если она доступна. Так говорят документы .
brillenheini
Да, дело в том (как сказал @brillenheini), чтобы иметь ViewPager, вам нужен v4, поэтому даже если вы ориентируетесь только на устройства v13 +, вы, скорее всего, все равно закончите иметь v4.
Сотти,
Я только что обнаружил это (ViewPager нуждается в версии 4) в моем API 21 и в приложении. Meh: - /
mraviator
2

Кажется, что сейчас лучше использовать библиотеку поддержки, потому что я видел здесь заявление https://developer.android.com/reference/android/app/Fragment.html

Этот класс объявлен устаревшим на уровне API P. Используйте фрагмент библиотеки поддержки для согласованного поведения на всех устройствах и доступа к жизненному циклу.

code4j
источник