利用Fragment的回退栈实现钉钉的组织架构功能

前言

开发中我们会遇到同一个标题头部,类似注册或重置密码时的分步操作,标题栏都是相同的,只是内容部分的输入框有所不同,可能会想到直接写多个Activity来实现,但是这样的话内存消耗上面就多了,这个时候我们就可以利用Fragment的回退栈来实现这个功能。本文所说的仿钉钉的组织架构功能就是基于这个来实现的,Fragment回退栈具体相关的知识可自行去了解,本文只作简单介绍。

相关方法

  • addToBackStack(String tag);//将Fragment加入回退栈,tag为此Fragment在回退栈中的唯一标识
  • getBackStackEntryCount();//获取回退栈Fragment的总个数
  • getBackStackEntryAt(int index);//获取回退栈中某个Fragment
  • popBackStack();//将回退栈中栈顶的Fragment出栈
  • popBackStackImmediate(String tag, int flags);
    tag为null,flags为0时,弹出回退栈中最上层的那个fragment,flags为1时,弹出回退栈中所有fragment。
    tag不为null,flags为0时,弹出该fragment以上的Fragment,如果是1,弹出该fragment(包括该fragment)以
    上的fragment。
  • fullScroll(HorizontalScrollView.FOCUS_RIGHT);//控制HorizontalScrollView滚动到最右边,延时调用

效果图

效果展示

实现思路

1.可以选择在加入回退栈的时候传入当前部门的名称作为tag

private void initDeptFragment(ArrayList<DeptListBean.DataBean.DepartmentListBean> mDeptList,
                                  ArrayList<String> mDeptUserList, String tag) {
        Fragment mDeptFragment = new DeptFragment();
        FragmentManager manager = getActivity().getSupportFragmentManager();
        Bundle bundle = new Bundle();
        bundle.putParcelableArrayList("deptList", mDeptList);
        bundle.putStringArrayList("deptUserList", mDeptUserList);
        mDeptFragment.setArguments(bundle);
        manager.beginTransaction()
                .replace(R.id.dept_content, mDeptFragment)
                .addToBackStack(tag)
                .commit();
    }

2.点击导航tab时,通过这个tag找到Fragment,然后再进行相关操作

 mNavView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int currentIndex = 0;

                    if (mNavView.getTag() != null) {
                        currentIndex = (int) mNavView.getTag();
                    }

                    if (currentIndex == 0) {//点击回到一级部门,清除所有回退栈
                        if (mNavNameList.size() > 1) {
                            getActivity().getSupportFragmentManager().popBackStackImmediate(mNavNameList.get(1), FragmentManager.POP_BACK_STACK_INCLUSIVE);
                        }
                    } else {
                        getActivity().getSupportFragmentManager().popBackStackImmediate(mNavNameList.get(currentIndex), 0);
                    }

                }
            });

3.动态添加导航tab后,控制滚动到最右边

mHsvNav.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mHsvNav.fullScroll(HorizontalScrollView.FOCUS_RIGHT); //方法不能直接被调用,可能会不生效,需先加入消息队列等待调用
                }
            }, 100L);

4.返回处理,根据回退栈Fragment数量决定是清除栈顶Fragment还是退出Activity

mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (getActivity().getSupportFragmentManager().getBackStackEntryCount() > 0) {
                    getActivity().getSupportFragmentManager().popBackStack();
                } else {
                    getActivity().finish();
                }
            }
        });

小弟理解可能有所偏差,欢迎各位对之中出现的错误或是代码的质量优化,不吝赐教,谢谢!

Demo下载


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值