Переключение между фрагментами, дающими неожиданные результаты
Я пытаюсь реализовать 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();
}
}