Вкладки на основе фрагментов — можно избежать создания новых фрагментов при каждом изменении?

#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 фрагмента, поэтому я сохраняю их в переменной для каждого. Затем, когда я переключаю фрагменты, я могу просто ссылаться на них с помощью этих переменных.

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

Другой случай, когда вы не хотите кэшировать это, — это когда фрагменты очень большие, и было бы эффективнее просто воссоздать фрагмент при необходимости, а не хранить все в памяти. (Классическая проблема с производительностью и памятью / хранилищем).

Надеюсь, это поможет вам принять правильное решение о вашей реализации.