如何使用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框架的冰山一角,还有更多功能等你来探索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/670292.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ISCC2024之Misc方向WP

目录 FunZip Magic_Keyboard Number_is_the_key RSA_KU 成语学习 钢铁侠在解密 工业互联网模拟仿真数据分析 精装四合一 时间刺客 有人让我给你带个话 FunZip 题目给了一个txt&#xff0c;内容如下 一眼丁真&#xff0c;base隐写&#xff0c;使用工具即可得到flag Fl…

functional函数对象库学习

类模板 std::function 是一种通用多态函数包装器。std::function 的实例能存储、复制及调用任何可复制构造 (CopyConstructible) 的可调用 (Callable) 目标——函数&#xff08;通过其指针&#xff09;、lambda 表达式、bind 表达式或其他函数对象&#xff0c;以及成员函数指针…

Java进阶学习笔记31——日期时间

Date&#xff1a; 代表的是日期和时间。 分配Date对象并初始化它以表示自标准基准时间&#xff08;称为纪元&#xff09;以来的指定毫秒数&#xff0c;即1970年1月1日00:00:00。 有参构造器。 package cn.ensource.d3_time;import java.util.Date;public class Test1Date {pu…

Tomcat安装和配置(图文详解)_tomcat安装及配置教程

Tomcat是一个开源的Web应用服务器&#xff0c;它是Apache软件基金会的一个项目。Tomcat被广泛用作Java Servlet和JavaServer Pages&#xff08;JSP&#xff09;技术构建的Web应用程序的运行环境。 它是轻量级的&#xff0c;适合中小型系统和并发访问用户不是很多的场合&#x…

FPGA基于DE2-115开发板驱动HC_SR04超声波测距模块|集成蜂鸣器,led和vga提示功能

文章目录 前言一、实验原理二、Verilog文件2.1 时钟分频2.2 超声波测距2.3 超声波驱动 三、实现过程3.1 模块说明3.2 引脚分配 三、演示视频总结参考 前言 环境 硬件 DE2-115 HC-SR04超声波传感器 软件 Quartus 18.1 目标结果 使用DE2-115开发板驱动HC-SR04模块&#xff0…

力扣刷题--2085. 统计出现过一次的公共字符串【简单】

题目描述 给你两个字符串数组 words1 和 words2 &#xff0c;请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。 示例 1&#xff1a; 输入&#xff1a;words1 [“leetcode”,“is”,“amazing”,“as”,“is”], words2 [“amazing”,“leetcode”,“is”] 输出…

万字详解 MySQL MGR 高可用集群搭建

文章目录 1、MGR 前置介绍1.1、什么是 MGR1.2、MGR 优点1.3、MGR 缺点1.4、MGR 适用场景 2、MySQL MGR 搭建流程2.1、环境准备2.2、搭建流程2.2.1、配置系统环境2.2.2、安装 MySQL2.2.3、配置启动 MySQL2.2.4、修改密码、设置主从同步2.2.5、安装 MGR 插件 3、MySQL MGR 故障转…

QT之动态加载树节点(QTreeWidget)

之前写过一篇动态加载ComboBox&#xff0c;可参见下面这篇文章 QT之动态加载下拉框&#xff08;QComboBox&#xff09; 同理QTreeWidget也可以实现动态加载&#xff0c;在一些异步加载数据&#xff0c;并且数据加载比较耗时&#xff0c;非常实用。 效果 原理分析 要实现此类效…

[数据集][图像分类]骨关节炎严重程度分类数据集14038张4分类

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;14038 分类类别数&#xff1a;4 类别名称:[“grade0”,“grade2”,“grade3…

如何使用KolorPanotourPro制作全景图像网页

目录 前言 KolorPanotourPro是什么 如何制作全景网页 1.拥有全景图 2.导入图片 3.在多张全景图中跳转 4.查看制作的全景网页 结束语 前言 今天是坚持写博客的第十五天&#xff0c;继续为努力和坚持的大家点赞和鼓掌。 书接上文&#xff0c;我们讲了如何使用如何使用A…

公园【百度之星】/图论+dijkstra

公园 图论dijkstra #include<bits/stdc.h> using namespace std; typedef long long ll; typedef pair<ll,ll> pii; vector<ll> v[40005]; //a、b、c分别是小度、度度熊、终点到各个点的最短距离 ll a[40005],b[40005],c[40005],dist[40005],st[40005]; void…

1.1 OpenCV随手简记(一)

OpenCV学习篇 OpenCV (Open Source Computer Vision Library) 是一个开源的计算机视觉库&#xff0c;它提供了大量的算法和函数&#xff0c;用于图像处理、计算机视觉和机器学习等领域。 1. OpenCV 简介 1.1 OpenCV 的起源和发展 OpenCV 项目始于 1999 年&#xff0c;由 In…

IDeal下的SpringBoot项目部署

一、首先找到自己的sql文件&#xff0c;没有就从数据库挪进来 二、在Maven下打包一下&#xff08;点击package&#xff09;&#xff0c;看到BUILD SUCCESS就是打包好了 三、将上面两个文件分别挪到 linux 中对应的文件&#xff0c;没有就创建一个&#xff08;我的是spring_blog…

制作ChatPDF之Elasticsearch8.13.4搭建(一)

Elasticsearch8.x搭建 在Windows系统上本地安装Elasticsearch的详细步骤如下&#xff1a; 1. 下载Elasticsearch 访问 Elasticsearch下载页面。选择适用于Windows的版本8.13.4&#xff0c;并下载ZIP文件。 2. 解压文件 下载完成后&#xff0c;找到ZIP文件&#xff08;例如…

【2023百度之星初赛】跑步,夏日漫步,糖果促销,第五维度,公园,新材料,星际航行,蛋糕划分

目录 题目&#xff1a;跑步 思路&#xff1a; 题目&#xff1a;夏日漫步 思路&#xff1a; 题目&#xff1a;糖果促销 思路&#xff1a; 题目&#xff1a;第五维度 思路&#xff1a; 题目&#xff1a;公园 思路&#xff1a; 新材料 思路&#xff1a; 星际航行 思路…

网上蛋糕售卖店管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;店员管理&#xff0c;用户管理&#xff0c;商品管理&#xff0c;基础数据管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告信息&#xff0c;商品…

MFC 解决Enter回车键和Esc取消键默认关闭窗口的三种方法

文章目录 问题描述问题原因解决办法方法一&#xff1a;在重载的PreTranslateMessage 函数中屏蔽回车和ESC 的消息方法二&#xff1a;重载OnOK函数方法三&#xff1a;将所有按钮类型设为普通按钮&#xff0c;并设置其中一个按钮为默认按钮 问题描述 一般情况下编写的MFC对话框程…

【如何在日志中输出精确到毫秒的时间戳】

1. 需求 在日志中输出精确到毫秒级的时间戳&#xff0c; 格式为&#xff1a;%Y-%m-%d %H:%M:%S.%MS 如&#xff1a;2024-05-30 22:33:25.821 2. 代码实现 #include <iostream> #include <chrono> #include <iomanip> #include <sstream> #include &…

锻压设备智能制造工厂物联数字孪生平台,推进制造业数字化转型

锻压设备智能制造工厂物联数字孪生平台&#xff0c;推进制造业数字化转型。随着全球制造业的飞速发展&#xff0c;数字化转型已经成为企业提升竞争力、实现可持续发展的关键。在锻压设备智能制造领域&#xff0c;工业物联数字孪生平台以其强大的数据集成、分析和管理能力&#…

k均值过程图解

k均值聚类实际上是数据空间质心的Voronoi 划分问题。