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

При разработке для 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 действительно все это полезно, или это просто прославленное упрощение получения вида, например, с помощью кода выше?

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

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

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

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

Ответ 5

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

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

Ответ 6

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