页面状态管理

在张鸿洋的LoadingAndRetryManager的基础上改写,修正一些 bug,优化 api,并提供使用时封装的例子

特性

api 超级简单

可以在 xml 中使用 StatefulFrameLayout

也可以不改动 xml,直接在代码里使用 PageStateManager

错误页面和空白页面均提供了点击事件的回调,直接实现即可

不改动 framlayout 本身任何属性,依然可以添加多个子 view

更新:fragment 的操作改变了

由于 fragment 的生命周期引起的 bug,已取消原先直接传入 fragment 对象的方式.

请改成传入组成 fragment 的 view,注意该 view 对象传入时,其 parent 不能为空,也就是,该 view 不能是 xml 的根 view,可以自己随便包一层.

ps.

其实 fragment 本质也是基于 view 包裹了一层 api,搞点生命周期之类的,api 难用得要死,还一大堆坑,还不如自己包装一个 view,自己加点生命周期,高度可控,减少 bug.我的项目中从来都不用 fragment,都是自己把 view 包装成各种 page.

API

参考 demo 里的,自己封装一层(拷过去改一改)

接口

public interface IViewState {

void showLoading();

void showError(CharSequence msg);

void showContent();

void showEmpty();

}

四个级别的配置

库内默认

自带 Loading,Empty,Error 的 xml:

public static int BASE_LOADING_LAYOUT_ID = R.layout.pager_loading;

public static int BASE_RETRY_LAYOUT_ID = R.layout.pager_error;

public static int BASE_EMPTY_LAYOUT_ID = R.layout.pager_empty;

使用时可全局配置

在 application 的 oncreate 里调用:

也就是修改上述的三个静态变量:

PageStateManager.initInAppOnCreate():public static void initInApp(int layoutIdOfEmpty, int layoutIdOfLoading, int layoutIdOfError) {

if (layoutIdOfEmpty != 0) {

BASE_EMPTY_LAYOUT_ID = layoutIdOfEmpty;

}

if (layoutIdOfLoading != 0) {

BASE_LOADING_LAYOUT_ID = layoutIdOfLoading;

}

if (layoutIdOfError != 0) {

BASE_RETRY_LAYOUT_ID = layoutIdOfError;

}

}

单个页面的配置:

可配置的项目:

// PageConfig 为抽象类:

仅一个必须实现的方法:

public abstract class PageConfig {

public abstract void onRetry(View retryView);//必须实现

public void onEmtptyViewClicked(View emptyView) {

onRetry(emptyView);

}

public boolean isFirstStateLoading(){

return true;

}

public String emptyMsg(){

return "";

}

public int customLoadingLayoutId() {

return PageStateManager.BASE_LOADING_LAYOUT_ID;

}

public int customErrorLayoutId() {

return PageStateManager.BASE_RETRY_LAYOUT_ID;

}

public int customEmptyLayoutId() {

return PageStateManager.BASE_EMPTY_LAYOUT_ID;

}

xml 里使用 statefulFrameLayout 时:

android:id="@+id/pager"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/context"

android:background="#ffff00"

android:text="i am the content!!!!!!!!!!!!!!!!!!!!!!!!!!!"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

android:layout_width="match_parent"

android:id="@+id/btn"

android:layout_marginTop="40dp"

android:text="view2"

android:layout_height="wrap_content"/>

statefulFrameLayout.init(new PageConfig() {

@Override

public void onRetry(View retryView) {

doNet();

}

});

或者使用 PageStateManager:

/**

*

* @param container 必须为 activity 或者 view.如果是 view,则该 view 对象必须有 parent

*/

pageStateManager = PageStateManager.initWhenUse(container,new MyPageConfig() {

@Override

protected void onReallyRetry() {

doNet();

}

@Override

public int customEmptyLayoutId() {

return R.layout.pager_empty_2;

}

@Override

public int customLoadingLayoutId() {

return R.layout.pager_loading_2;

}

@Override

public int customErrorLayoutId() {

return R.layout.pager_error_2;

}

});

控制页面状态的 api:

public void showLoading()

public void showContent()

public void showEmpty()

public void showError(CharSequence errorMsg)

demo 中的默认的几个页面状态 UI 图

其中无网络时弹出 dialog:

无网络的对话框可以全局复写:

NoNetworkHelper.setShowDialogImpl(IShowDialog showDialog)

public interface IShowDialog{

void showNoNetWorkDlg(final Context context);

}

使用

gradle

Step 1. Add the JitPack repository to your build file

Add it in your root build.gradle at the end of repositories:

allprojects {

repositories {

...

maven { url "https://jitpack.io" }

}

}

Step 2. Add the dependency

dependencies {

compile 'com.github.hss01248:PageStateManager:3.0.1'

}

示例代码(详见 demo)

xml 里不写 StatefulFramelayout 时:

private void initView() {

setContentView(R.layout.activity_main);

pageStateManager = PageStateManager.initWhenUse(this,new PageConfig() {

@Override

public int customEmptyLayoutId() {

return R.layout.pager_empty_2;

}

@Override

public void onRetry(View retryView) {

doNet();

}

@Override

public int customLoadingLayoutId() {

return R.layout.pager_loading_2;

}

@Override

public int customErrorLayoutId() {

return R.layout.pager_error_2;

}

});

}

private void doNet() {

pageStateManager.showLoading();

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

int state = new Random().nextInt(3);

switch (state){

case 0:

pageStateManager.showError("稍候重试");

break;

case 1:

pageStateManager.showEmpty();

break;

case 2:

pageStateManager.showContent();

}

}

},2000);

}

在 xml 里直接写时:

......

statefulFrameLayout = (StatefulFrameLayout)findViewById(R.id.pager);

statefulFrameLayout.init(new PageConfig() {

@Override

public void onRetry(View retryView) {

doNet();

}

});

doNet();

}

private void doNet() {

statefulFrameLayout.showLoading();

new Handler().postDelayed(new Runnable() {

@Override

public void run() {

int state = new Random().nextInt(3);

switch (state){

case 0:

statefulFrameLayout.showError("稍候重试 222222");

break;

case 1:

statefulFrameLayout.showEmpty();

break;

case 2:

statefulFrameLayout.showContent();

}

}

},2000);

}

注意事项

1.给 view 对象设置状态时,该对象必须有 parent

2.

blog

张鸿洋 视频 android,PageStateManager 在张鸿洋的 LoadingAndRetryManager 的基础上改写,优化 api,封装 @codeKK Android开源站...相关推荐

  1. android堆内存解析,heapsnap HeapSnap 是一款针对 Android 进程堆内存进行追踪、定位,以便查出泄露位置的工具 @codeKK c开源站...

    1.HeapSnap 是什么 HeapSnap 是一个定位内存泄露的工具,适用于 Android 平台. 主要特性如下: 对系统负载低 不需要修改目标进程的源代码 支持 Andoroid 上的大多数 ...

  2. android 混音 源码,FFmpegAndroid android 端基于 FFmpeg 实现音频剪切、拼接、转码、混音、编解码;视频剪切、水印、截图、转码、编 @codeKK c开源站...

    android 端基于 FFmpeg 库的使用 添加编译 ffmpeg.shine.mp3lame.x264 源码的参考脚本 目前音视频相关处理: 音频剪切.拼接 音频混音 音频转码 音视频合成 音频 ...

  3. android差分升级原理,BigNews Android 增量更新框架差分包升级 @codeKK c开源站

    支持增量包/差分包/升级包 原理:在服务器端使用 bsdiff 工具将新老安装包的差异打包为一个体积较小的差分包/升级包,然后在 App 端通过 bspatch 工具(和 bsdiff 配套的)用差分 ...

  4. android在标准linux基础上对休眠唤醒的实现,Android在标准linux基础上对休眠唤醒的实现(三)...

    chen_chuang2012-10-11 16:33 高手,有本书上写cdev初始化和注册是这样写的 static void VirtualDisk_setup_cdev(struct Virtua ...

  5. 微信之夜,张小龙说视频化表达将会成为下一个十年内容领域的主题

    因为疫情,今年微信的公开课Pro和开发者倍加关注的微信之夜放到了线上举行,微信之父,腾讯高级执行副总裁.微信事业群总裁张小龙的微信之夜直播,更是用今天他在演讲中反复提及的视频号进行直播,将今天的活动推 ...

  6. 张春晖让视频的每词每句都可搜索:Autotiming 可以自动配字幕,还将改变哪些领域?...

    张春晖让视频的每词每句都可搜索:Autotiming 可以自动配字幕,还将改变哪些领域? 对于一些电视观众来说,寻找电视节目字幕中"有趣"的Bug,拍照发到网上与其他人共同嘲笑一下 ...

  7. 整合微视“明牌”开战,腾讯视频打出最后一张牌

    图片来源于网络 文|螳螂财经 作者|陈小江 继2018年9月30日腾讯平台与内容事业群(PCG)组织架构大变革后,日前腾讯PCG再次变阵.此次调整涉及两个事业群.一个子公司和五位集团副总裁.其中,最有 ...

  8. 大模型新势力:IDEA研究院张家兴入局创业,沈向洋任顾问,首轮估值20亿

    衡宇 发自 凹非寺 量子位 | 公众号 QbitAI 大模型创业江湖,又来了两位重磅大牛. 张家兴,粤港澳大湾区数字经济研究院(IDEA研究院)讲席科学家.认知计算与自然语言中心负责人,被曝已经启动了 ...

  9. android 字符画,抖音上很火的字符画 Android 实现 | 视频转换实现

    作者:Line_cut_feng 链接:https://www.jianshu.com/p/a14f1ac558e1 之前我推送过抖音上很火的字符画 Android 实现,当时文末:按说拿到ascii ...

最新文章

  1. 关于学习Python的一点学习总结(34->构造函数->重写方法和特殊构造)
  2. Calendar详解
  3. select * from ( union ) ')' 附近有语法错误。
  4. React 第八章 列表渲染以及key的使用
  5. python函数的四个特点_Python面向对象三大特征之封
  6. MSP430学习小结3-MSP430基本时钟模块
  7. 大数据开发笔记(八):Spark综合笔记总结
  8. VS和Codeblocks安装相关
  9. android 在非UI线程更新UI仍然成功原因深入剖析
  10. 检查pandas是否存在一列或者多列
  11. 新一代工业系统集成控制软件平台—CODESYS
  12. java 数据字典使用_java中数据字典怎么用?图文详解
  13. 动态生成表格--JS案例
  14. vega56刷64_A卡—Vega56的简易玩法
  15. LeetCode 打家劫舍题型 解析
  16. Fatal signal 11 (SIGSEGV) at 0x00000004 (code=1)
  17. 做人不能太“广州有线”了
  18. 语音识别-声纹识别-语音合成【专题三】
  19. 说说大型网站可伸缩性架构的设计原理
  20. PR软件——音频变音(机器音)

热门文章

  1. 05 Redis 持久化的设计和实现
  2. windows-problem :电脑上网的无线图标带有黄色星号,但不影响正常上网!
  3. 如果网络工程师的能力有等级,你会是哪一级?
  4. php 微信永久登录,php微信登录
  5. css中div超出自动换行
  6. vfp和c语言,c语言程序设计和vfp程序设计试题.doc
  7. 学生学籍管理系统简单设计(中)
  8. 今天遇到的坑--this.$emit
  9. 【2018最新VR眼镜哪个好】什么VR眼镜好,全民评测,选最合适的
  10. 那些前端的特效(装哈哈神器)