В чем преимущество использования фрагментов в Android вместо представлений? - PullRequest
102 голосов
/ 23 декабря 2011

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

У меня такой вопрос: в чем преимущество использования Fragments по сравнению с простым получением View от пользовательского объекта и поддержкой 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

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

Ответы [ 6 ]

166 голосов
/ 05 апреля 2013

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

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

После ответа я понял, что опубликовал аналогичный вопрос годом ранее: https://stackoverflow.com/a/11126397/618881

27 голосов
/ 23 декабря 2011

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

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

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

3 голосов
/ 18 января 2013
  1. Разделение экрана сценария действий - у нас есть один макет и одно действие, которые обрабатывают левую правую часть экрана
  2. Сценарий FragmentActivity У нас есть один макет для главного экрана, один для левого, другой для правого

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

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

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

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

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

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

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

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

3 голосов
/ 23 декабря 2011

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

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

0 голосов
/ 24 июля 2015

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

0 голосов
/ 05 ноября 2013

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

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

...