2015-07-05 2 views
32

Фрагмент и пользовательский вид могут достичь аналогичной функции, я знаю, что фрагмент более многократно используется для сравнения с пользовательским представлением, любыми другими преимуществами/улучшениями для использования фрагмента? Является ли фрагмент предполагаемым для замены Custom View или просто улучшением для определенной цели?Фрагмент против пользовательского вида в Android

Например, код ниже фрагмент:

public class TestFragment extends Fragment { 

    private TextView tv_name; 
    private Button btn_play; 
    private Button btn_delete; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.testfragment, container, false); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 

     tv_name = (TextView)getView().findViewById(R.id.tv_name); 
     btn_play = (Button)getView().findViewById(R.id.btn_play); 
     btn_delete = (Button)getView().findViewById(R.id.btn_delete); 

    } 
} 

Код для настраиваемого представления:

public class TestCustomView extends LinearLayout { 

    private TextView tv_name; 
    private Button btn_play; 
    private Button btn_delete; 

    public TestCustomView(Context context, AttributeSet attrs){ 
     super(context, attrs); 

     setOrientation(LinearLayout.HORIZONTAL); 
     setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 

     tv_name = new TextView(context); 
     addView(tv_name); 

     btn_play = new Button(context); 
     addView(btn_play); 

     btn_delete = new Button(context); 
     addView(btn_delete); 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.testfragment, container, false); 
    } 
} 

Оба TestFragment и TestCustomView могут создать представление, состоящее из TextView и Buttons , и использовать теги Framelayout/fragment и com.packagename.TestCustomView, чтобы заявить в действии ' s xml, но в чем преимущества использования фрагмента?

+0

Я нахожу фрагменты полезными, когда вам нужен доступ к чему-то, чего нет у View, например. информацию о жизненном цикле фрагмента или что-то вроде «LoaderManager». – Karakuri

ответ

21

фрагментов можно использовать в различных сценариях, но наиболее используемые является:

  • обертки зрения
  • обезглавленного фрагмент - т.е. без вида => не очень полезно в целом, но может быть использована
  • сохрана фрагмент - может быть любым из вышеперечисленных. С помощью Fragment.setRetainInstance(true) вы можете обойти Fragment.onDestroy(), т.е. может хранить данные фрагмента на изменения конфигурации, но вид фрагмента структуры по-прежнему разрушен/воссозданы
  • могут быть добавлены к деятельности обратно в стек, т.е. простой кнопки Назад в предыдущее состояние восстановления

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

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

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

+0

Thans for answer. Было бы неплохо увидеть некоторые конкретные примеры, демонстрирующие плюсы и минусы использования фрагментов над представлениями и наоборот, чтобы лучше понять, какой подход более подходит. В настоящее время мне кажется, что фрагменты - это путь, но снова некоторые примеры могут помочь понять возможные недостатки этого подхода. –

13

Фрагменты имеют свой жизненный цикл, который может быть препятствием или бонусом, в зависимости от того, что вам нужно.

Фрагменты получают методы жизненного цикла, такие как onResume или onSavedInstanceState, которые могут помочь вам справиться с переходами состояния в вашем приложении. Если вы используете пользовательские представления, вам нужно обращаться с такими вещами самостоятельно.

Есть люди, которые выступают против использования фрагментов, я предлагаю читать https://corner.squareup.com/2014/10/advocating-against-android-fragments.html

6

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

+1

Я знаю, что это старый ответ, но этот ответ кажется неправильным, поскольку док говорит: «Фрагмент всегда должен быть встроен в действие, а жизненный цикл фрагмента напрямую зависит от жизненного цикла хоста. Например, когда действие приостановлено , то есть все фрагменты в нем, и когда действие уничтожается, так же как и все фрагменты. Однако, пока действие выполняется (оно находится в состоянии возобновленного жизненного цикла), вы можете самостоятельно управлять каждым фрагментом, например добавлять или удалять их «. Источник: https://developer.android.com/guide/components/fragments.html – Pelpotronic

10

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

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

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

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

+3

Все верно, но это не объясняет, в чем преимущество использования фрагмента над пользовательским видом. – alfasin

+0

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

-4

Фрагмент может содержать некоторые виды, но представление не должно содержать фрагмент. Так как способ структурирования вещей: активности -> Fragment -> Просмотр

И все зависит только от ваших требований и как будет обрабатывать структуру вашего приложения.

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