欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Fragment回退栈简述

程序员文章站 2022-06-08 12:16:37
...

简述

Fragment与Activity同样存在栈,只是我们平时很少使用到,下面我们将简述Fragment的回退栈及其使用方法。

效果图

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