UiStatus一个简单且强大的AndroidUi视图状态控制库.

UiStatus 一个简单且强大的Android Ui视图状态控制库.

我一直觉得程序员就像诗人一样,敲代码就像写诗,好的代码何尝不是一首优美的诗!

所以我把项目中的视图控制部分抽取出来,单独封装成了UiStatus这个库。希望可以帮助大家简化这部分操作,也希望对大家有用。

部分效果演示

优点:

1.轻量:简单且够用!!!

2.省内存:使用ViewStub,所有未使用到的状态均不会初始化,减少视图初始化开销。

3.解耦、封装:降低各种视图状态和业务层耦合,使用者只需要关心业务层逻辑而无需知道视图状态管理内部逻辑。

4.自由:不提供任何状态视图,高度可配置,完全由开发者自己定义。

5.强大:可以使用在任何Activity、Fragment、View当中。

目前该库包含的状态有9种:

常量名称 含义 使用场景
LOADING 加载中 页面加载中状态
NETWORK_ERROR 网络错误 当网络连接错误时展示的界面
LOAD_ERROR 加载失败 接口请求失败时展示给用户的界面
EMPTY 空布局 当获取的数据为空时展示的界面
NOT_FOUND 未找到内容布局 有时获取的内容已被服务器删除,此时展示给用户一个404内容被删除的界面
CONTENT 内容 真正需要展示给用户的内容视图,也是开发者在layout里实际布局的视图
WIDGET_NETWORK_ERROR 网络错误小部件 一个类似于QQ、微信断网时顶部显示的网络错误提示视图
WIDGET_ELFIN 小精灵(提示布局) 一种顶部出现的提示布局,可以做类似于简书刷新时提醒推荐内容条数的小部件
WIDGET_FLOAT 底部Float 一种底部弹出的浮动布局,可以实现底部弹出小组件的功能

在这里我们将前6种状态称之为普通状态视图,后面3种统称为Widget小部件。下文不再赘述!

其中,普通状态视图不会同时显示,Widget小部件状态的显示和前6种状态不冲突(可以同时显示),

视图层次上Widget在普通状态视图之上,WIDGET_ELFIN在WIDGET_NETWORK_ERROR之下。

使用步骤

1.添加依赖

step one:

allprojects {

    repositories {

        maven { url 'https://www.jitpack.io' }

}

}

step two :

dependencies {

        implementation 'com.github.FengChenSunshine:UiStatus:{version}'

}

2.全局配置

UiStatus库不提供任何状态的视图,完全由开发者自己自定义提供。

①.获取全局视图控制管理者.

UiStatusManager.getInstance()

②.配置状态视图.

/**

* @params uiStatus    视图状态.

* @params layoutResId 开发者自定义的该状态视图.

*/

addUiStatusConfig(@UiStatus int uiStatus, @LayoutRes int layoutResId);

/**

* @params uiStatus          视图状态.

* @params layoutResId        开发者自定义的该状态视图.

* @params retryTriggerViewId 该状态视图上点击事件的触发控件id.

* @params retryListener      点击事件触发后的回调.

*/

addUiStatusConfig(@UiStatus int uiStatus, @LayoutRes int layoutResId, @IdRes int retryTriggerViewId, OnRetryListener retryListener);

/**

* 该方法只针对Widget相关状态有效.

* @params uiStatus      视图状态.

* @params topMarginPx    widget相对于内容视图的顶部距离,比如可能需要预留出顶部Toolbar高度的距离.

* @params bottomMarginPx widget相对于内容视图的底部距离,比如可能需要预留出底部导航栏高度的距离.

*/

setWidgetMargin(@UiStatus @IntRange(from = 7L,to = 9L) int uiStatus, int topMarginPx, int bottomMarginPx);

③.配置网络状态提供者.

考虑到开发者项目中都有自己的网络状态监听、判断的工具类,

所以UiStatus没有必要额外编辑这段功能代码,仅需要开发者配置一个回调即可。

配置网络状态提供者后,在请求显示普通的状态时如果是没有网络那么将自动重定向到NETWORK_ERROR网络错误状态界面。

具体配置方法如下:

UiStatusNetworkStatusProvider

        .getInstance()

        .registerOnRequestNetworkStatusEvent(OnRequestNetworkStatusEvent networkStatusEvent);

3.具体使用

UiStatus可以使用在任何Activity、View以及Fragment中.

①.Activity中:

UiStatusController.get().bind(activity);

②.View中:

UiStatusController.get().bind(view);

③.Fragment中:

由于Fragment的特殊性,所以这里稍微麻烦一点点:

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view;

        //你的视图初始化...

        mUiStatusController = UiStatusController.get();

        return mUiStatusController.bindFragment(view);

}

看以看出这里是使用bindFragment(view)方法将原本的内容视图传递给UiStatus,并将该方法返回的控件作为onCreateView的返回值即可。

④.视图状态切换:

对于普通视图切换使用UiStatusController.changeUiStatusIgnore(uiStatus)切换;

对于Widget视图使用UiStatusController.showWidget(uiStatus)进行显示;

或者使用其重载方法showWidget(uiStatus,duration)方法进行显示,使用该方法时会在duration时间后自动隐藏;

也可以使用UiStatusController.hideWidget()方法进行隐藏Widget小部件。

4.成功

经过上面的步骤之后您已经成功的集成并且可以使用UiStatus库了,并且您肯定也看到了想要看到的各种状态下的视图成功切换。

如果您不需要某些页面的个性化定制,那么到这里就OK了;否则请看下面的步骤会满足你的需求。

5.个性化配置

一般情况下使用在Application中的全局配置已经能满足大部分页面视图状态的需求,

如果某些个别界面需要特殊配置那么UiStatus也是支持的。

只需要使用持有的UiStatusController对象,调用其addUiStatusConfig()或其他任何可以在全局配置中使用的方法重新配置即可。

6.优化

一般的开发者只需要在自定义的Application中全局配置一次即可,并且对于LOADING、LOAD_ERROR、EMPTY、NOT_FOUND、CONTENT这些普通视图的切换可以下沉到 统一在基类Activity、Fragment或者网络加载框架中处理,具体使用大同小异,可参考Demo,这里不再赘述。

7.UiStatus可实现效果部分展示

注:图片来自其他APP,仅供参考实现效果使用。其他未列出效果不代表不能实现,具体可实现效果尽情发挥想象!!!

status_load_error

status_not_found
status_widget_network_error
status_widget_float
status_widget_elfin
status_widget_elfin_2

最后附上github链接,喜欢的可以点个赞

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,780评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,424评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,397评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,576评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,997评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,945评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,107评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,850评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,625评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,804评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,285评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,613评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,291评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,164评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,963评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,096评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,886评论 2 278

推荐阅读更多精彩内容

  • 本文结构 (一)前 言 (二)产品体验报告 (三)典型使用场景 (四)打 个总 结 (五)做 个 游 ...
    高昂GoingOn阅读 1,794评论 0 0
  • 成立综合实践主题项目学习研究工作室以来,在县教研室领导的具体指导下,我们项目工作室的成员以“关注每个孩子的学习生活...
    yanziguilai阅读 435评论 0 1
  • 下面说两种在屏幕正中(水平居中+垂直居中)的方法放上示范的html代码: MAIN 12345 方法一:div...
    赵学习阅读 223评论 0 0
  • 不知道,发生了什么。明明一切都按平常来的啊,为什么会突然觉得孤独呢。也许。自己又多愁善感了吧。 我是阿九,...
    提莫阿九阅读 213评论 0 1
  • 《你所担心的事情九成都不会发生》这是一本书名,也是生活中的一些事实。你们有没有经常瞎操心了,瞎操心只会让我们越...
    诚思心梦阅读 156评论 0 3