Fragment回退栈简述

    xiaoxiao2022-07-02  96

    简述

    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功能一样强大,甚至更加方便使用,遇到问题,不要轻易的说没有见过而放弃。

    最新回复(0)