Fragment回退栈简述
程序员文章站
2022-06-08 12:16:37
...
简述
Fragment与Activity同样存在栈,只是我们平时很少使用到,下面我们将简述Fragment的回退栈及其使用方法。
效果图
原理
- Activity有任务栈,用户通过startActivity将Activity加入栈,点击返回按钮将Activity出栈。Fragment也有类似的栈,称为回退栈(Back Stack),回退栈由FragmentManager管理的。
- 如果没有加入回退栈,则用户点击返回按钮会直接将Activity出栈;如果加入了回退栈,则用户点击返回按钮会回滚Fragment事务。 默认情况下,Fragment事务是不会加入回退栈的,如果想将Fragment加入回退栈并实现事物回滚,首先需要在commit()方法之前调用事务的以下方法将其添加到回退栈中。
核心代码
@Override
public void onClick(View v) { //点击事件
fragmentManager = getFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
switch (v.getId()) {
case R.id.add1:
if (!fragment1.isAdded()) {
fragmentTransaction.add(R.id.frameLayout, fragment1);
fragmentTransaction.addToBackStack("tag1");
}
break;
case R.id.add2:
if (!fragment2.isAdded()) {
fragmentTransaction.add(R.id.frameLayout, fragment2);
fragmentTransaction.addToBackStack("tag2");
}
break;
case R.id.add3:
if (!fragment3.isAdded()) {
fragmentTransaction.add(R.id.frameLayout, fragment3);
fragmentTransaction.addToBackStack("tag3");
}
break;
}
fragmentTransaction.commit();
}
@Override
public void onBackPressed() { //返回事件
Log.e("getBackStackEntryCount-", fragmentManager.getBackStackEntryCount() + "");
if (fragmentManager.getBackStackEntryCount() > 1) {
fragmentManager.popBackStack("tag1", 0);
} else {
super.onBackPressed();
}
}
核心方法
-
popBackStack(int id, int flags):其中id表示提交变更时commit()的返回值。
-
popBackStack(String name, int flags):其中name是addToBackStack(String tag)中的tag值。
注:在上面2个方法里面,都用到了flags,其实flags有两个取值:0或FragmentManager.POP_BACK_STACK_INCLUSIVE。0: 表示除了参数指定这一层之上的所有层都退出栈,指定的这一层为栈顶层;
POP_BACK_STACK_INCLUSIVE: 表示连着参数指定的这一层一起退出栈。 -
getBackStackEntryCount():获取回退栈中Fragment的个数。
-
getBackStackEntryAt(int index):获取回退栈中该索引值下的Fragment。
使用popBackStack()来弹出栈内容的话,调用该方法后会将事物操作插入到FragmentManager的操作队列,只有当轮询到该事物时才能执行。如果想立即执行事物的话,可以使用下面这几个方法:
- popBackStackImmediate()
- popBackStackImmediate(String tag)
- popBackStackImmediate(String tag, int flag)
- popBackStackImmediate(int id, int flag)
总结
Fragment与Activity功能一样强大,甚至更加方便使用,遇到问题,不要轻易的说没有见过而放弃。