回退栈

作者: 夜沐下的星雨 | 来源:发表于2020-08-05 11:25 被阅读0次

Fragment 的回退栈
创建MvpFragmentManager :

//Fragment 的回退栈
public class MvpFragmentManager {
    public static BaseFragment addOrShowFragment(FragmentManager manager, Class<? extends BaseFragment> fragmentClass, BaseFragment lastFragment, @IdRes int containerId) {
        //获取碎片管理器
        FragmentTransaction transaction = manager.beginTransaction();

//      获取fragment 的name
        String tag = fragmentClass.getName();
//      获取fragment
        BaseFragment baseFragment = (BaseFragment) manager.findFragmentByTag(tag);
        if (baseFragment == null) { // 当前activity 已经添加了 该fragment
            try {
                //得到fragment的实体对象
                baseFragment = fragmentClass.newInstance();

                /**
                 * 比如: 从A里面要显示B, B就是将要显示的fragment,A就是上一个fragment
                 * 第一个enter: 表示将要显示的fragment 进入的动画
                 * 第二个exit :表示上一个fragment 退出的动画
                 * 第三个popEnter: 表示按返回键是上一个fragment 弹进的动画
                 * 第四个popExit :表示按返回键时 将要显示的fragment被弹出的动画,
                 */
                //通过碎片管理器设置自定义动画
                transaction.setCustomAnimations(baseFragment.getEnterAnimation(),
                        (lastFragment == null ? 0 : lastFragment.getExitAnimation()),
                        (lastFragment == null ? 0 : lastFragment.getPopEnterAnimation()),
                        baseFragment.getPopExitAnimation());
                //添加fragment
                transaction.add(containerId, baseFragment, tag);
                //如果添加到返回中堆
                if (baseFragment.isNeedAddToBackStack()){

                }
                //  将 fragment 添加到回退栈中
                transaction.addToBackStack(tag);//把这一次事务添加到回退栈里面
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else { // 当前 activity 已经添加过这个fragment    有移除了


            int count = manager.getBackStackEntryCount();//获取回退栈里面 事务的个数
            //通过事务将
            FragmentManager.BackStackEntry entry=null;
            for (int i = 0; i < count; i++) {
                entry=manager.getBackStackEntryAt(i);
                if (entry.getName().equals(tag)){
                    //弹出栈
                    manager.popBackStackImmediate(tag,0);
                    return baseFragment;
                }
            }
          /*  if (count>0){
                manager.popBackStackImmediate(manager.getBackStackEntryAt(0).getName(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
                return baseFragment;
            }*/
            if (!baseFragment.isAdded()) { // 如果没有添加
                transaction.add(containerId, baseFragment, tag);
            }
            if (baseFragment.isDetached()) { // 如果从activity  detach(分离) 了
                transaction.attach(baseFragment);
            }
            if (baseFragment.isHidden()) {// 如果被隐藏了
                transaction.show(baseFragment);
            }
        }
        if (lastFragment != null) { // 如果之前有fragment 存在。即上一个fragment
            transaction.hide(lastFragment); // 对该fragment 隐藏
        }
        handPreFragment(transaction,lastFragment,baseFragment);
//        提交
        transaction.commit();
        return baseFragment; // 把自己(即将要显示的) 返回出去。

    }
    private static void handPreFragment(FragmentTransaction transaction,BaseFragment lastFragment,BaseFragment willShowFragment){
        if (lastFragment!=null){
            switch (willShowFragment.getActionFroPreFragment()){
                case REMOVE:
                    //删除当前
                    transaction.remove(lastFragment);
                    break;
                case DETACH:
                    //分离当前
                    transaction.detach(lastFragment);
                    break;
                case HIDE:
                    //隐藏当前
                    transaction.hide(lastFragment);
                    break;
            }
        }
    }
}

监听使用

  MvpFragmentManager.addOrShowFragment(getFragmentManager(),FragmentB.class,FragmentA.this,R.id.home_fragment_container);

相关文章

  • iOS webView 回退栈

    Android 的webView有回退栈,其实iOS的webView也有回退栈! webView的回退栈其实就是表...

  • Fragment回退栈和Activity栈不太一样

    Fragment回退栈,加入到Fragment回退栈里面的fragment出栈后,处于栈顶的fragment也不会...

  • 回退栈

    Fragment 的回退栈创建MvpFragmentManager : 监听使用

  • 实习笔记17.07.20

    fragment回退栈?当Activity继承AppCompatActivity时 fragmentTransa...

  • Activity-四种启动模式及使用方法

    一、任务栈(或叫回退栈) 说到Activity的启动模式,必须先了解Activity的任务栈。 android任务...

  • fragment回退栈

    https://blog.csdn.net/zhiyuan0932/article/details/5259303...

  • Fragment 回退栈

    一、什么是回退栈Activity切换时是通过栈的形式,不断压栈出栈,在Fragment的时候,如果你不是手动开启回...

  • Fragment 回退栈

    一、什么是回退栈 Activity切换时是通过栈的形式,不断压栈出栈.在Fragment的时候,如果你不是手动打开...

  • window.history 页面栈的回退问题

    我们平时再跳转页面时,页面会被保存至页面栈里。每次回退或左滑回退时,会延页面栈依次返回。 那么问题来了,现有场景如...

  • Fragment回退栈详解

    一、什么是回退栈 Activity切换时是通过栈的形式,不断压栈出栈,在Fragment的时候,如果你不是手动开启...

网友评论

      本文标题:回退栈

      本文链接:https://www.haomeiwen.com/subject/pdwmrktx.html