Подтвердить что ты не робот

Фрагмент против пользовательского вида в Android

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

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

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 для объявления в файле макета xml-активности, но какие преимущества для использовать фрагмент?

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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