当前位置: 首页 > news >正文

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

我想大家对Fragment都不陌生,它作为界面碎片被使用在Activity中,如果只是更换Activity中的一小部分界面,是没有必要再重新打开一个新的Activity的。有时,即使要更换完整的UI布局,也可以使用Fragment来切换界面。
WechatIMG11.jpeg
WechatIMG12.jpeg

何为流式切换

流式切换?不好意思,我给大家杜撰了一个词,所以大家陌生也很正常。简单的说,就是,点击下一步,下一步来按顺序更换界面的内容。你可以想象成是一个ArrayList。不过,大多数时候的Fragment界面切换都不是流式切换。比如底部的tab按钮,点击切换一个Fragment就不是流式切换。

效果演示

不管Fragment是否是流式切换,我们先看一个动画。
10_1683820132.gif
使用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框架的冰山一角,还有更多功能等你来探索。

相关文章:

  • 【JAVA WEB实用与优化技巧】Maven自动化构建与Maven 打包技巧
  • HackTheBox-Machines--Lazy
  • 大聪明教你学Java | 深入浅出聊 Stream.parallel()
  • 【面试题】JavaScript基础高频面试(上)
  • 在SpringBoot项目中实现切面执行链功能
  • 【SQL学习进阶】从入门到高级应用【三范式】
  • ChatGPT AI专题资料合集【65GB】
  • [补题记录]LeetCode 167.两数之和 II - 输入有序数组
  • 【自己动手】自制刷题系统(php+layui应用 社区工作者题库)
  • 24年护网工具,今年想参加护网的同学要会用
  • 深度学习训练时混合精度的作用
  • 如何使用AES128位进行视频解密
  • Leetcode:字符串转换整数 (atoi)
  • 软件开发整体介绍
  • Java中连接Mongodb进行操作
  • iOS Hittest 机制和实际应用之一 hittest方法
  • 【魅力网页的背后】:CSS基础魔法,从零打造视觉盛宴
  • ChatGPT-3
  • 【开源】新生报到网站 JAVA+Vue.js+SpringBoot+MySQL
  • 【原创】springboot+mysql员工管理系统
  • “一嗨租车”陷“五年后扣费”疑云,用户:违章处理莫名消失
  • 波音公司计划于2027年交付新版“空军一号”飞机
  • 复旦设立新文科发展基金,校友曹国伟、王长田联合捐赠1亿元
  • 习近平抵达莫斯科对俄罗斯进行国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典
  • 上海黄浦区拟73.2654亿元协议出让余庆里7宗组合地块
  • 赵乐际:深入学习贯彻习近平生态文明思想,推动森林法全面有效贯彻实施