我想咱们对Fragment都不生疏,它作为界面碎片被运用在Activity中,假如仅仅替换Activity中的一小部分界面,是没有必要再从头翻开一个新的Activity的。有时,即便要替换完整的UI布局,也能够运用Fragment来切换界面。

如何使用Dora SDK完成Fragment流式切换和非流式切换
如何使用Dora SDK完成Fragment流式切换和非流式切换

何为流式切换

流式切换?不好意思,我给咱们臆造了一个词,所以咱们生疏也很正常。简单的说,便是,点击下一步,下一步来按次序替换界面的内容。你能够幻想成是一个ArrayList。不过,大多数时分的Fragment界面切换都不是流式切换。比方底部的tab按钮,点击切换一个Fragment就不是流式切换。

作用演示

不论Fragment是否是流式切换,咱们先看一个动画。运用Dora SDK就能够很方便的完成这一作用,并且是不会有堆叠现象的。待会我会讲解Fragment切换的规范写法。

怎么运用Dora SDK的Fragment切换

// 增加以下代码到项目根目录下的build.gradle
allprojects {
    repositories {
        maven { url "https://jitpack.io" }
    }
}
// 增加以下代码到app模块的build.gradle
dependencies {
    implementation 'com.github.dora4:dora:1.0.106'
}

首先要增加Dora SDK的依赖,推荐运用最新版本的sdk,即1.0.106。然后承继并运用dora.BaseActivity和dora.BaseFragment。

package dora;
import dora.util.IntentUtils;
/**
 * 在Activity中切换多个Fragment时运用。
 */
public interface PageSwitcher {
    /**
     * Fragment非流式切换之显现页面。
     */
    void showPage(String key);
    /**
     * Fragment非流式切换之显现页面。
     */
    void showPage(String key, IntentUtils.Extras extras);
    /**
     * Fragment流式切换之显现下一页。
     */
    void nextPage();
    /**
     * Fragment流式切换之显现下一页。
     */
    void nextPage(IntentUtils.Extras extras);
}

里边有一个关键的接口,名叫PageSwitcher。它是专门用来切换Activity中的Fragment的。showPage表明非流式切换,而nextPage则表明流式切换。BaseActivity和BaseFragment都完成了这个接口,所以你能够在Activity或Fragment的任意当地进行流式切换和非流式切换。Fragment很简单,承继BaseFragment就能够了。Activity要点来了,承继BaseActivity后能够重写这几个办法。

getFlowFragment(String key)
getFlowFragmentContainerId()
getFlowFragmentPageKeys()

重写getFlowFragment告诉结构key和fragment的映射联系。 重写getFlowFragmentContainerId()告诉结构哪部分布局区域需求替换Fragment内容。 假如你不重写这个办法,就会走以下办法,最终拿到的便是android.R.id.content,这个布局下面便是咱们自己界说的界面的根布局。

private int getDefaultFlowFragmentContainerId() {
    int defFragmentId = getFlowFragmentContainerId();
    if (defFragmentId != 0) {
        return getFlowFragmentContainerId();
    } else {
        return android.R.id.content;
    }
}

重写getFlowFragmentPageKeys()告诉结构一切key的次序,它回来一个数组,数组中key的次序便是fragment的摆放次序。 调用nextPage()就会按次序,从第一个Fragment切换到最后一个Fragment,切换到最后一个停止。假如你需求更灵敏的切换这些fragment,就需求运用showPage了,很简单吧。

无堆叠切换Fragment的规范写法

  1. initFragments
private void initFragments() {
    if (xxxFragment == null) {
        xxxFragment = XxxFragment();
        FragmentUtils.add(getSupportFragmentManager(), xxxFragment, R.id.fragmentContainer);
    }
    if (yyyFragment == null) {
        yyyFragment = YyyFragment();
        FragmentUtils.add(getSupportFragmentManager(), yyyFragment, R.id.fragmentContainer);
    }
    if (zzzFragment == null) {
        zzzFragment = ZzzFragment();
        FragmentUtils.add(getSupportFragmentManager(), zzzFragment, R.id.fragmentContainer);
    }
}
  1. 躲藏activity中一切fragment 调用BaseFragment中的hideFragments()来完成。以下为hideFragments源码
protected void hideFragments(Collection<BaseFragment<?>> fragments) {
    if (fragments == null) {
        return;
    }
    for (BaseFragment<?> fragment : fragments) {
        FragmentUtils.hide(fragment);
    }
}
  1. 显现要显现的那个fragment
private void showXxxFragment() {
    hideFragments(allFragments);
    if (xxxFragment == null) {
        xxxFragment = new XxxFragment();
        FragmentUtils.add(getSupportFragmentManager(), xxxFragment, R.id.fragmentContainer);
    }
    FragmentUtils.show(xxxFragment);
}

这里加个fragment为null的判别是为了防止你忘记initFragments。

谈谈我的开源结构系列

我的开源结构总共有三条路线,dora为中心架构,dcache数据缓存方向,dview为自界说View系列,本篇也仅仅介绍dora结构的冰山一角,还有更多功用等你来探索。