Android编程至高武学之《如来神掌》第三式~佛动山河

来源:互联网 发布:如何使用淘宝模板 编辑:程序博客网 时间:2024/04/29 14:55

      回书Android编程至高武学之《如来神掌》第二式~金顶佛灯 ,我已经把一个基本的android框架(demo)传授于大家了。当然有大神觉得low的鄙视,以后我会还大家一个公道:给你们弄一个复杂一点的框架(MVP+Dagger2+rxjava+retrofit),敬请期待...生气。目前这个虽然low点(其实不叫low,就是很直白而已),但是对于一般的开发足够了。今天我就先给大家分析下那个框架中的一个知识点:栈管理fragment。下面有请主角登场:

      先上代码:

public class FragmentStack {  //list模拟栈,将fragmnet放进栈里面管理 private ArrayList<ArrayList<Fragment>> stackList = new ArrayList<>();    private ArrayList<Fragment> stack;    private CloseFragment listener;    public FragmentStack() {        if (stack == null) {            stack = new ArrayList<>();        }        stackList.add(stack);    } //第一次将fragment加入栈,要保证栈内只有一个fragment。    public void firstPutStandard(Fragment fragment) {        stack.clear();        stackList.get(stackList.size() - 1).add(fragment);    } //普通标准模式方式入栈:直接加入就行。    public void putStandard(Fragment fragment) {        stackList.get(stackList.size() - 1).add(fragment);    }    //singleTop模式入栈:栈顶唯一性    public boolean putSingleTop(Fragment fragment) {        ArrayList<Fragment> lastList = stackList.get(stackList.size() - 1);        if (lastList.isEmpty()) {            lastList.add(fragment);            return false;        } else {            Fragment last = lastList.get(lastList.size() - 1);            if (last.getClass().getName().equals(fragment.getClass().getName())) {//                fragment.onNewIntent();                BaseFragment rootFragment = (BaseFragment) fragment;                rootFragment.onNewIntent();                return true;            } else {                lastList.add(fragment);                return false;            }        }    }    //singleTask模式入栈:有且仅有一个fragment。    public boolean putSingleTask(Fragment fragment) {        boolean isClear = false;        ArrayList<Fragment> lastList = stackList.get(stackList.size() - 1);        if (lastList.isEmpty()) {            lastList.add(fragment);        } else {            int tempIndex = 0;            for (int x = 0; x <= lastList.size() - 1; x++) {                if (lastList.get(x).getClass().getName().equals(fragment.getClass().getName())) {                    //clear all instance                    isClear = true;                    tempIndex = x;                    break;                }            }            if (!isClear) {                lastList.add(fragment);            } else {                if (listener != null) {                    listener.show(lastList.get(tempIndex));                    StackManager.isFirstClose = true;                    for (int i = lastList.size() - 1; i > tempIndex; i--) {                        listener.close(lastList.get(i));                    }                    for (int j = lastList.size() - 1; j > tempIndex; j--) {                        lastList.remove(j);                    }                }            }        }        return isClear;    }    //singleInstance模式入栈:每次创建一个新的任务栈。    public void putSingleInstance(Fragment fragment) {        ArrayList<Fragment> frags = new ArrayList<>();        frags.add(fragment);        stackList.add(frags);    }  //回退操作的时候,移除当前fragment    public void onBackPressed() {        int i = stackList.size() - 1;        if (i >= 0) {            ArrayList<Fragment> lastStack = stackList.get(i);            if (lastStack != null && (!lastStack.isEmpty())) {                lastStack.remove(lastStack.size() - 1);                if (lastStack.isEmpty()) {                    stackList.remove(lastStack);                }            } else {                stackList.remove(lastStack);            }        } else {            stackList.clear();        }    }    protected void setCloseFragmentListener(CloseFragment listener) {        this.listener = listener;    }    //获取最后两个fragment:一个为当前fragment,一个为目标fragment(跳转或者回退)    protected Fragment[] getLast() {        Fragment[] fagArr = new Fragment[2];        boolean hasFirst = false;        for (int x = stackList.size() - 1; x >= 0; x--) {            ArrayList<Fragment> list = stackList.get(x);            if (list != null && (!list.isEmpty())) {                if (hasFirst) {                    fagArr[1] = list.get(list.size() - 1);                    break;                } else {                    hasFirst = true;                    fagArr[0] = list.get(list.size() - 1);                    if (list.size() > 1) {                        fagArr[1] = list.get(list.size() - 2);                    }                }            }        }        return fagArr;    }}

      是不是so easy?简单粗暴,一看就懂。当然,如果您实在是不太理解,或者不怎么会用,那么请观看俺的上一篇博客Android编程至高武学之《如来神掌》第二式~金顶佛灯 。或者直接去下载demo,https://Git.oschina.NET/bjnq/NeiquanDemo,运行后里面直接有用法。

     本回书完,下回还是分解一下上篇博客给大家贡献的demo,敬请期待.....

2 0
原创粉丝点击