回退栈

作者: 夜沐下的星雨 | 来源:发表于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);
    

    相关文章

      网友评论

          本文标题:回退栈

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