我不知道这是否完美,但我曾经做过这样的事情。我有一堆整数类型(我们称之为stackOfFragmentTracker)。所以假设你有片段 f1、f2、f3、f4,你做了 f1->f3->f4->f2。那么stackOfFragmentTracker 就会有这样的内容:1->3->4->2。
接下来,您只为每个片段创建一个实例(因此在我的示例中,例如 f1、f2、f3、f4 每个只有一个实例),并且您会将它们以 INVISIBLE 状态保存在 backStack 中:
final int ONE = 1; // a map to Fragment 1
final int TWO = 2; // a map to fragment 2
stackOfFragmentTracker.push(ONE);
ExampleFragment f1 = null;
if(fragmentManager.findFragmentByTag(ExampleFragment.TAG)==null){
f1 = new ExampleFragment();
fragmentManager.beginTransaction()
.add(R.id.flToMountOn, f1, ExampleFragment.TAG)
.addToBackStack(ExampleFragment.TAG)
.hide(f1) // <------- this makes your fragment invisible
.commit();
}
你会为你的所有片段都这样做。
接下来,您需要一个 Fragment 变量(例如,Fragment active),将其指向您的第一个片段(即您第一次要去的地方)并使其可见。
active = f1;
fragmentManager.beginTransaction().show(f1).commit();
为了保持清洁,您可以使用以下两种方法:
private void hideActiveFragment(){
if(currentlyActiveFragment!=null){
fragmentManager.beginTransaction().hide(currentlyActiveFragment).commit();
}
}
private void showActiveFragment(Fragment nextFragment){
active = nextFragment;
if(active!=null){
fragmentManager.beginTransaction().show(active).commit();
}
}
最后,每当您前进时,您都会将一个数字推入stackOfFragmentTracker 并简单地使该片段可见:
// say we are going to f2
void switchFragment(int n){
stackOfFragmentTracker.push(n); // you may keep a check if n is valid or not
if(n==1){
hideActiveFragment();
showActiveFragment(f1);
}else if(n==2){
hideActiveFragment();
showActiveFragment(f2);
} // ... ... ...
}
然后onBackPress 这样做:
void insideBackPress(){
stackOfFragmentTracker.pop();
int top = stackOfFragmentTracker.top();
if(top==1){
hideActiveFragment();
showActiveFragment(f1);
}else if(top==2){
hideActiveFragment();
showActiveFragment(f2);
} // ... ... ...
}
我知道这个例子有点混乱,但我希望你明白这一点。为各种极端情况添加必要的检查(如果 stackOfFragmentTracker isEmpty),或者在我的示例中使用HashMap 而不是if-else 块。祝你好运。