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

при разработке для 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

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

6 ответов


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

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

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


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

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

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


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

здесь вы можете подробнее.


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

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

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

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

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

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

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

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

на мой взгляд, это хорошо, но не по той причине, что google говорить нам.


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

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


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