Фрагмент против пользовательского вида в 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-активности, но какие преимущества для использовать фрагмент?
Ответы
Ответ 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
Фрагмент может содержать некоторые представления, но представление не должно содержать фрагмент. Так как способ структурирования вещей:
Активность → Фрагмент → Просмотр
И все зависит от ваших требований и того, как вы будете обрабатывать структуру своего приложения.