自从TabActivity被弃用后,我试图用已经在开发者Android网站上提到的Fragments替换它。 但是正如你们已经知道的,有一个关于用fragment替换选项卡的问题,因为只有一个Fragment Activity活动,所以没有每个片段的后退堆栈,正如你可以在其他SO问题中看到的大多数开发人员所说,你需要管理自己的自定义后退堆栈作为一种解决方案。
如下所示,我创建和实现了自己的自定义后退堆栈,它完美地工作,我可以跟踪每个选项卡中的每个片段。
选项卡1
根据上面的导航,在我从Fragment1通过Fragment3进行导航之后,如果我更改选项卡到Tab2并回到Tab1,我仍然可以看到Fragment3,甚至可以使用我的自定义返回堆栈返回到Fragment1。
但问题在于,当我回到Tab1并看到Fragment3时,Fragment3会重新创建,我无法看到我在切换到Tab2之前所留下的更改。
这是我的自定义返回堆栈;
因此,在切换选项卡后,自定义返回栈运行良好,但是在返回到选项卡时,最后一个片段正在重新创建,而不像在选项卡活动中一样恢复。
如下所示,我创建和实现了自己的自定义后退堆栈,它完美地工作,我可以跟踪每个选项卡中的每个片段。
选项卡1
Fragment1 > Fragment2 > Fragment3
选项卡2
Fragment5 > Fragment6
根据上面的导航,在我从Fragment1通过Fragment3进行导航之后,如果我更改选项卡到Tab2并回到Tab1,我仍然可以看到Fragment3,甚至可以使用我的自定义返回堆栈返回到Fragment1。
但问题在于,当我回到Tab1并看到Fragment3时,Fragment3会重新创建,我无法看到我在切换到Tab2之前所留下的更改。
这是我的自定义返回堆栈;
public static HashMap<String, Stack<Fragment>> customBackStack;
public static Stack<Fragment> simpleStack;
public static Stack<Fragment> contactStack;
public static Stack<Fragment> customStack;
public static Stack<Fragment> throttleStack;
public static Stack<Fragment> homeStack;
customBackStack = new HashMap<String, Stack<Fragment>>();
homeStack = new Stack<Fragment>();
simpleStack = new Stack<Fragment>();
contactStack = new Stack<Fragment>();
customStack = new Stack<Fragment>();
throttleStack = new Stack<Fragment>();
customBackStack.put("home", homeStack);
customBackStack.put("simple", simpleStack);
customBackStack.put("contacts", contactStack);
customBackStack.put("custom", customStack);
customBackStack.put("throttle", throttleStack);
这里是onTabChanged方法:
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) {
if (!customBackStack.get(tabId).isEmpty()) {
Fragment fragment = customBackStack.get(tabId).pop();
customBackStack.get(tabId).push(fragment);
ft.replace(mContainerId, fragment);
}
} else {
if (!customBackStack.get(tabId).isEmpty()) {
Fragment fragment = customBackStack.get(tabId).pop();
customBackStack.get(tabId).push(fragment);
ft.replace(mContainerId, fragment);
}
}
}
mLastTab = newTab;
ft.commit();
mActivity.getSupportFragmentManager().executePendingTransactions();
}
}
这里是onBackPressed;
public void onBackPressed() {
Stack<Fragment> stack = customBackStack.get(mTabHost.getCurrentTabTag());
if (stack.isEmpty()) {
super.onBackPressed();
} else {
Fragment fragment = stack.pop();
if (fragment.isVisible()) {
if (stack.isEmpty()) {
super.onBackPressed();
} else {
Fragment frg = stack.pop();
customBackStack.get(mTabHost.getCurrentTabTag()).push(frg);
transaction = getSupportFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right,
R.anim.slide_in_right, R.anim.slide_out_left);
transaction.replace(R.id.realtabcontent, frg).commit();
}
} else {
getSupportFragmentManager().beginTransaction().replace(R.id.realtabcontent, fragment).commit();
}
}
}
因此,在切换选项卡后,自定义返回栈运行良好,但是在返回到选项卡时,最后一个片段正在重新创建,而不像在选项卡活动中一样恢复。
有什么解决办法吗?
编辑
您可以在此处找到我的示例应用程序,作为解决此问题的解决方案。
onTabChanged()
方法中,if(newTab.fragment == null)
的代码和这个条件的else
部分是相同的。我认为没有必要添加这个条件。 - Houcine