В чем преимущество использования фрагментов в Android, а не Views?

418
39

При разработке для Android вы можете установить целевой (или минимальный) sdk на 4 (API 1.6) и добавить пакет совместимости android (v4), чтобы добавить поддержку для Fragments. Вчера я сделал это и успешно реализовал Fragments для визуализации данных из пользовательского класса.


Мой вопрос в следующем: в чем преимущество использования Fragments в отличие от простого получения представления из пользовательского объекта и поддержки API 1.5?


Например, скажем, у меня есть класс Foo.java:


public class Foo extends Fragment {

/** Title of the Foo object*/
private String title;
/** A description of Foo */
private String message;

/** Create a new Foo
* @param title
* @param message */
public Foo(String title, String message) {
this.title = title;
this.message = message;
}//Foo

/** Retrieves the View to display (supports API 1.5. To use,
* remove 'extends Fragment' from the class statement, along with
* the method {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)})
* @param context Used for retrieving the inflater */
public View getView(Context context) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.foo, null);
TextView t = (TextView) v.findViewById(R.id.title);
t.setText(this.title);
TextView m = (TextView) v.findViewById(R.id.message);
m.setText(this.message);
return v;
}//getView

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (container == null) {
return null;
}
View v = inflater.inflate(R.layout.foo, null);
TextView t = (TextView) v.findViewById(R.id.title);
t.setText(this.title);
TextView m = (TextView) v.findViewById(R.id.message);
m.setText(this.message);
return v;
}//onCreateView

}//Foo


Оба метода очень просты в создании и работе с Activity, которые, скажем, имеют List<Foo> для отображения (например, программно добавляя каждый к ScrollView), так что Fragments действительно все это полезно, или это просто прославленное упрощение получения вида, например, с помощью кода выше?

спросил(а) 2011-12-23T18:25:00+04:00 9 лет, 2 месяца назад
1
Решение
536

Основная причина использования фрагментов - для функций backstack и lifecycle. В противном случае пользовательские представления более легки и проще реализовать.


Сначала я попытался создать приложение для телефона/планшета, используя пользовательские представления. Все, казалось, работало на телефонах и планшетах, даже переключение с одной панели на панель разделения. Там, где я столкнулся с проблемой, была обратная кнопка и жизненный цикл. Поскольку я просто обновлял представления вручную... не было ничего отслеживания истории взглядов и их состояний. Поэтому кнопка "Назад" не работала должным образом, и было сложно воссоздать даже последнее состояние во время жизненного цикла, например, при повороте приложения. Чтобы исправить это, мне пришлось обернуть мои пользовательские представления во фрагментах и ​​использовать FragmentManager, чтобы предыдущие состояния были сохранены и воссозданы.

Я понял, ответив, что я отправил аналогичный вопрос годом ранее: qaru.site/questions/58728/...

ответил(а) 2013-04-05T04:07:00+04:00 7 лет, 10 месяцев назад
223

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


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

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

ответил(а) 2011-12-23T18:52:00+04:00 9 лет, 2 месяца назад
87

    Сценарий Activity Split screen. У нас есть One Layout и один вид деятельности, который обрабатывает часть в правом левом углу.
    Сценарий FragmentActivity у нас есть Один макет для главного экрана, один для левой для правой

Сценарий один хорош, если у вас есть простое приложение.


Сценарий два хорош, если вы хотите иметь несколько фрагментов и несколько фрагментов
и вы можете объединить каждый из них. Также вы можете взаимодействовать между фрагментами.


У меня есть раздвоенный экран Fragmentactivity, я могу называть его "Intent Extras" и рассказывать фрагменту, который должен быть загружен. Фрагменты хороши, потому что они не проявляются, поэтому вы можете сделать многоразовые фрагменты и FragmentActvity.


Но это делает ваш проект более крупным. Но если вы делаете большой проект, вы можете сэкономить много. Поскольку вы можете использовать одни и те же фрагменты или одну и ту же активность фрагмента.


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


Это полезно, но я не знаю, как сейчас. Но у меня есть некоторые идеи.


Это всегда проблема. Команда Android сделала что-то неопределенное, и никто не знает, для чего это полезно. Потому что мы вряд ли узнаем, как это было, и здесь возникают новые вещи.


По-моему, это хорошо, но не потому, что Google говорит нам.

ответил(а) 2013-01-18T18:38:00+04:00 8 лет, 1 месяц назад
86

Android представил фрагменты в Android 3.0 (уровень API 11), в первую очередь для поддержки более динамичных и гибких пользовательских интерфейсов на больших экранах, таких как планшеты. Поскольку экран планшета намного больше, чем планшет, там больше места для объединения и обмена компонентами пользовательского интерфейса. Фрагменты позволяют создавать такие проекты без необходимости управлять сложными изменениями в иерархии представлений. Разделив макет действия на фрагменты, вы сможете изменить внешний вид активности во время выполнения и сохранить эти изменения в стеке, которое управляется действием.



Здесь вы можете прочитать больше.

ответил(а) 2011-12-23T18:55:00+04:00 9 лет, 2 месяца назад
43

Добавьте один случай при использовании фрагмента или действия над CustomView:


Когда вы используете CursorLoader для наблюдения за определенными видами, ListView или TextView и хотите обновлять их отображаемое значение всякий раз, когда ваши данные ContentProvider обновляются на задней панели (в большинстве случаев у вас есть служба, которая обновляет вашу локальную базу данных путем опроса данных из удаленной базы данных/облако периодически)

ответил(а) 2013-11-05T04:41:00+04:00 7 лет, 3 месяца назад
-6

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

ответил(а) 2015-07-24T22:54:00+03:00 5 лет, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема