#android #optimization #android-fragments #tabs
#Android #оптимизация #android-фрагменты #вкладки
Вопрос:
Я создал очень простой контроллер вкладок на основе фрагментов для своего приложения.
Fragment f = null;
switch(index) {
case 0:
f = new AFragment();
break;
case 1:
f = new BFragment();
break;
case 2:
f = new CFragment();
break;
}
if(f!=null) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.pnlTabContent, f);
ft.commit();
}
Эти фрагменты управляются ActionBar-tabs:
ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.addTab(actionBar.newTab().setText("A").setIcon(R.drawable.tab_a).setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("B").setIcon(R.drawable.tab_b).setTabListener(this));
actionBar.addTab(actionBar.newTab().setText("C").setIcon(R.drawable.tab_c).setTabListener(this));
Это работает хорошо, моя единственная проблема в том, что я создаю новые фрагменты при каждом изменении вкладки. Это звучит неэффективно. Итак, моей первой мыслью было просто создать массив ( Fragment[] tabs
) в основном действии, чтобы сохранить фрагменты в памяти, а затем заменить переключатель в первом блоке кода на Fragment f = tabs[index];
.
Но я не могу найти ни одной статьи, в которой упоминается эта проблема, что наводит меня на мысль, что действительно обычной практикой является создание экземпляров новых фрагментов каждый раз. Это верно? Нет ли способов «буферизации» фрагментов?
Ответ №1:
Это действительно зависит от приложения. Вы определенно можете буферизировать / кэшировать фрагменты. Я делаю именно это в одном из своих приложений. У меня есть только 3 фрагмента, поэтому я сохраняю их в переменной для каждого. Затем, когда я переключаю фрагменты, я могу просто ссылаться на них с помощью этих переменных.
Теперь есть сценарии, в которых вы не хотите этого делать, потому что вам может потребоваться перезагрузить / обновить данные во фрагменте, и простое его повторное создание более эффективно, чем написание дополнительного кода для обработки сценария обновления.
Другой случай, когда вы не хотите кэшировать это, — это когда фрагменты очень большие, и было бы эффективнее просто воссоздать фрагмент при необходимости, а не хранить все в памяти. (Классическая проблема с производительностью и памятью / хранилищем).
Надеюсь, это поможет вам принять правильное решение о вашей реализации.