fragment保存数据后返回到指定fragment

本文介绍了一种在Android应用中高效管理Fragment的方法,通过设置Tag来轻松切换和找回指定的Fragment,同时提供了添加和切换Fragment的封装代码,以及如何利用Tag进行回退栈管理。

 移出后添加的fragment,展示指定的fragment:

添加fragment时候  需要fragment设置Tag,利用Tag找到指定fragment

public void rollBackAppointFragment(String fragmentName) {
        int fragmentCount = getSupportFragmentManager().getBackStackEntryCount();

        if ("".equals(fragmentName) || fragmentName == null) {
            while (fragmentCount > 1) {
//            getSupportFragmentManager().popBackStack();
                getSupportFragmentManager().popBackStackImmediate();
                fragmentCount--;
            }
        } else {
            for (int i = fragmentCount - 1; i > -1; i--) {
                FragmentManager.BackStackEntry entry = getSupportFragmentManager().getBackStackEntryAt(i);
                
                getSupportFragmentManager().popBackStackImmediate();
                if (entry.getName().equals(fragmentName)) {
                    break;
                }
            }
        }
      
    }

封装的两个添加fragment的方法:

在addFragment和switchContent方法中,对隐藏的fragment添加Tag(fragment.getClass().getSimpleName()),方便后面跳转到指定fragment使用(也可以用fragment  Id)

//添加fragment,移除了当前的fragment,添加新fragment。点击返回键fragment会重建
public void addFragment(BaseFragmentTwo fragment) {
    if (fragment != null) {
        getSupportFragmentManager().beginTransaction()
                //transaction.replace(R.id.fragment_container,fragment,tag);
                //fragment.getClass().getSimpleName() 就是fragment的Tag
                .replace(R.id.frameLayout, fragment, fragment.getClass().getSimpleName())
                .addToBackStack(fragment.getClass().getSimpleName())
                .commitAllowingStateLoss();
    }
}

//添加fragment,隐藏了当前fragment,点击返回时当前的视图和数据还依然存在
public void switchContent(Fragment from, Fragment to) {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction().setCustomAnimations(
            android.R.anim.fade_in, R.anim.abc_fade_out);
    if (!to.isAdded()) {    // 先判断是否被add过
        transaction.hide(from);
        transaction.add(R.id.frameLayout, to);
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        transaction.addToBackStack(from.getClass().getSimpleName());
        transaction.commit(); // 隐藏当前的fragment,add下一个到Activity中
    } else {
        transaction.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个
    }
}

 下面两个不执行的方法(没搞清楚怎么解决,看源码是需要mStateSaved这个参数的值设置为false,不然会报异常,下面代码就不执行了,清楚的高手希望留言交流,项目紧张,后面抽空解决会回来更新)

popBackStack(String tag,int flags)

tag可以为null或者相对应的tag,flags只有0和1(POP_BACK_STACK_INCLUSIVE)两种情况

如果tag为null,flags为0时,弹出回退栈中最上层的那个fragment。

如果tag为null ,flags为1时,弹出回退栈中所有fragment。

如果tag不为null,那就会找到这个tag所对应的fragment,flags为0时,弹出该

fragment以上的Fragment,如果是1,弹出该fragment(包括该fragment)以

上的fragment。

getActivity().getSupportFragmentManager().popBackStackImmediate(CreateGroupNameFragment.class.getName(), FragmentManager.POP_BACK_STACK_INCLUSIVE);

即弹出Tag为CreateGroupNameFragment之上的所有(包括自身)的Fragment。

popBackStackImmediate(name,flag);


 

第二个参数:只能是 0 或者 1(POP_BACK_STACK_INCLUSIVE);

第一个参数为null时,第二个参数为0时:

会弹出回退栈中最上层的那一个fragment。

因为经测试,回退栈中的fragment个数减少了一个。

第二个参数为1时:会弹出所有回退栈中的fragment。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值