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

OnCreateView называется несколько раз/Работа с ActionBar и фрагментами

Я переключил часть своего приложения из "Действия в фрагменты", чтобы я мог использовать аккуратные вкладки ActionBar.

Однако после завершения перехода я столкнулся с проблемой: всякий раз, когда я переключаюсь на другую вкладку, этот фрагмент создается снова и снова. И onCreate, и onCreateView вызывается каждый раз, когда я попадаю на вкладку.

У меня есть 4 вкладки, каждая из которых предназначена для открытия одного из этих фрагментов:

Fragment ShopFragment = new WebActivity();
Fragment SearchFragment = new SearchActivity(context);
Fragment StoreFragment = new StoreLocatorActivity(context, this);
Fragment BlogsFragment = new BlogsActivity(context, this);

Здесь мой код для слушателя:

    class MyTabsListener implements ActionBar.TabListener {
        public Fragment fragment;

        public MyTabsListener(Fragment fragment) {
            this.fragment = fragment;
        }

        @Override
        public void onTabReselected(Tab tab, FragmentTransaction ft) {
            ft.hide(fragment);
        }

        @Override
        public void onTabSelected(Tab tab, FragmentTransaction ft) {
            ft.replace(R.id.fragment_container, fragment);
        }

        @Override
        public void onTabUnselected(Tab tab, FragmentTransaction ft) {          

        }

    }

Может ли кто-нибудь указать мне в правильном направлении?

4b9b3361

Ответ 1

Когда вы вызываете FragmentTransaction.replace(...), Android эффективно выполнит последовательность FragmentTransaction.remove(...) (для всех фрагментов, добавленных в этот контейнер) и FragmentTransaction.add(...) (для предоставленного вами фрагмента). Удаление фрагмента из FragmentManager приведет к разрушению фрагмента, и его состояние больше не будет управляться. Наиболее заметно, что при повторном добавлении фрагмента все представления будут reset. Примечание: поскольку вы повторно используете один и тот же экземпляр фрагмента, фрагмент все равно сохранит значение любых переменных экземпляра.

Одним из решений этой проблемы было бы использовать FragmentTransaction.detach(Fragment) и FragmentTransaction.attach(Fragment) при переключении. Это приведет к воссозданию представлений фрагментов (будут вызваны onDestroyView() и onCreateView()), но пакет состояния экземпляра будет сохранен и возвращен вам между вызовами, и поэтому состояние просмотра может быть сохранено. Это подход, используемый FragmentPagerAdapter, когда он пытается переключиться между фрагментами.

В качестве альтернативы вы можете разрешить уничтожение фрагментов, но сохранить их сохраненное состояние для них независимо. Это будет использовать меньше памяти за счет более медленного времени переключения. Методы примечания: FragmentManager.saveFragmentInstanceState(фрагмент) и FragmentManager.setInitialSavedState( Fragment.SavedState), в сочетании с добавлением/удалением. Это подход, используемый FragmentStatePagerAdapter.

Вы можете посмотреть источник для FragmentPagerAdapter и источник для FragmentStatePagerAdapter для подсказок реализации.

Ответ 2

Существует опция show/hide, чтобы фрагменты не нуждались в перерисовываться/воссоздаваться, а onCreate() и onCreateView() не будут повторно зависеть.