由于 TabActivity 已弃用,我尝试将其替换为已在开发人员 android 网站中提到的 Fragments。但是正如你们已经知道的那样,用片段替换选项卡存在一个问题,因为只有一个活动,即片段活动,每个片段都没有回栈,正如您在其他 SO 问题中看到的那样的开发人员说您需要管理自己的自定义后台堆栈作为解决方案。
我已经创建并实现了我自己的自定义后台堆栈,如下所示,它运行良好,我可以跟踪每个选项卡中的每个片段。
选项卡1
Fragment1 > Fragment2 > Fragment3
选项卡2
Fragment5 > Fragment6
根据上面的导航,如果我从 Fragment1 导航到 Fragment 3,然后如果我将选项卡更改为 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();
}
}
}
结果,自定义返回堆栈工作正常,除了更改选项卡之前的最后一个片段在返回选项卡后重新创建,它不像选项卡活动那样恢复。
知道如何解决吗?
编辑
您可以在此处找到我的示例应用程序,作为有关此问题的解决方案。