Переключение между фрагментами, дающими неожиданные результаты

Я пытаюсь реализовать FragmentTabs как illiustrated в http://developer.android.com/resources/samples/Support4Demos/src/com/example/android/supportv4/app/FragmentTabs.html. Все прошло хорошо, пока я не сделал это:

Я начал много разных фрагментов с одной вкладки, например:

tab1 → fragment1 --- > FRAGMENT2 --- > fragment3

Таб2

Но когда я переключился на tab2 и снова вернулся к tab1, у меня был экран фрагмента1, а не фрагмент3 (т.е. у меня есть 3 фрагмента на первой вкладке, а пока я на третьем фрагменте, и я снова заходил на первую вкладку после перехода на вторую вкладку, Я попал в 1-й фрагмент, а не третий). Может ли кто-нибудь сказать, что может быть проблемой?

        @Override
        public void onTabChanged(String tabId) {
            TabInfo newTab = mTabs.get(tabId);
            if (mLastTab != newTab) {
                FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
                if (mLastTab != null) {
                    if (mLastTab.fragment != null) {
                        ft.detach(mLastTab.fragment);
                    }
                }
                if (newTab != null) {
                    if (newTab.fragment == null) {
                        newTab.fragment = Fragment.instantiate(mActivity,
                                newTab.clss.getName(), newTab.args);
                        ft.add(mContainerId, newTab.fragment, newTab.tag);
                    } else {
                        ft.attach(newTab.fragment);
                    }
                }

                mLastTab = newTab;
                ft.commit();
                mActivity.getSupportFragmentManager().executePendingTransactions();
            }
        }

Когда я комментирую attach() и detatch(), я получаю следующее:

enter image description here

Ответ 1

Без подробностей трудно сказать, что неправильно. Однако из личного опыта я могу сказать, что, когда мне сначала приходилось внедрять вкладки фрагментов, я просмотрел множество паршивых руководств, прежде чем найти что-то, что сработало. Учебник, который, наконец, имел смысл для меня, здесь: http://thepseudocoder.wordpress.com/2011/10/04/android-tabs-the-fragment-way/

В качестве бонуса также есть некоторый исходный код Github: https://github.com/mitchwongho/Andy/tree/master/Andy/src/com/andy/fragments/tabs

Ответ 2

Обновление:

Я рекомендую вам сохранить исходный код для onTabChanged и использовать метод addToBackStack для поддержания состояния обхода фрагментов. Вызовите addToBackStack при переходе от одного фрагмента к следующему, например, когда add ing или replace ing фрагменты.

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


Не прикрепляйте и не отключайте каждый раз, когда изменяется вкладка.

   @Override
    public void onTabChanged(String tabId) {
        TabInfo newTab = mTabs.get(tabId);
        if (mLastTab != newTab) {
            FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();

            if (newTab != null) {
                if (newTab.fragment == null) {
                    newTab.fragment = Fragment.instantiate(mActivity,
                            newTab.clss.getName(), newTab.args);
                    ft.add(mContainerId, newTab.fragment, newTab.tag);
                } else {
                    ft.replace(mContainerId, newTab.fragment, newTab.tag);
                } 
            }
            mLastTab = newTab;
            ft.commit();
            mActivity.getSupportFragmentManager().executePendingTransactions();
        }
    }