Fragment回退栈简述

简述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值