2011-12-23 5 views
98

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

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

+2

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

+0

Я ответил на это в другом вопросе. См. Http://stackoverflow.com/a/14912608/909956 T; dr - иногда фрагменты позволяют создавать больше компонентов многократного использования, чем полагаться на реализацию пользовательского представления. см. ссылку для чего. –

ответ

162

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

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

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

+14

Очень хороший ответ. Я просто хотел добавить, что фрагменты могут быть вложены с 4.2 или поддержки библиотеки rev 11. –

+2

Спасибо @Karlo за обновление.Я не думал, что это было концептуально возможно, но они работали вокруг него, используя частный FragmentManager через getChildFragmentManager(). О, и это API 17, а не 11, и доступен через Библиотеку поддержки. – Henry

+2

Я просто смотрел на этот вопрос снова, и мой опыт тоже изменился. Это ответ, который обеспечивает хорошее понимание преимуществ и недостатков и очень полезно. Благодаря! – Phil

27

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

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

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

+0

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

3

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

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

+0

Я прочитал всю документацию, однако я искал что-то, что лучше объясняет их пользу, например, для планшетов или стоп-качки – Phil

3
  1. Сценарий Экран активности Split - Мы один Компоновка и одна деятельность, ручка влево правую часть экрана
  2. Сценарий FragmentActivity у нас есть один макет для главного экрана, один для левого для правого

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

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

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

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

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

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

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

По-моему, это хорошо, но не потому, что Google сообщает нам.

0

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

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

-2

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

 Смежные вопросы

  • Нет связанных вопросов^_^