【发布时间】:2012-10-12 07:18:12
【问题描述】:
由于不推荐使用 TabActivity,我尝试将其替换为已在开发人员 android 网站中提到的 Fragments。但是正如你们已经知道的那样,用片段替换选项卡存在一个问题,因为只有一个活动,即片段活动,每个片段都没有回栈,正如您在其他 SO 问题中看到的那样的开发人员说您需要管理自己的自定义后台堆栈作为解决方案。
我已经创建并实现了我自己的自定义返回堆栈,如下所示,它运行良好,我可以跟踪每个选项卡中的每个片段。
Tab1
Fragment1 > Fragment2 > Fragment3
Tab2
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();
}
}
}
因此,自定义返回堆栈工作正常,除了更改选项卡之前的最后一个片段在返回选项卡后重新创建,它不像在选项卡活动中那样恢复。
知道怎么解决吗?
编辑
您可以在此处找到我的示例应用程序作为解决此问题的方法。
【问题讨论】:
-
下面的答案没有区别。
-
我们正在其中一个 tabFragment 中添加新片段...我们如何做到这一点
-
@Vikky 我编辑了我的问题。查看我的 GitHub 存储库,您可以在其中找到示例应用程序。 GitHub
-
@osayilgan:你找到解决上述问题的方法了吗?如果你有一些解决方案会很高兴
标签: android android-fragments android-tabhost