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

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

我一直以为程序员就像诗人同样,敲代码就像写诗,好的代码未尝不是一首优美的诗!git

因此我把项目中的视图控制部分抽取出来,单独封装成了UiStatus这个库。但愿能够帮助你们简化这部分操做,也但愿对你们有用。程序员

部分效果演示github

优势:

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,仅供参考实现效果使用。其余未列出效果不表明不能实现,具体可实现效果尽情发挥想象!!!

最后给你们分享一份很是系统和全面的Android进阶技术大纲及进阶资料,及面试题集

想学习更多Android知识,请加入Android技术开发企鹅交流 7520 16839

进群与大牛们一块儿讨论,还可获取Android高级架构资料、源码、笔记、视频

包括 高级UI、Gradle、RxJava、小程序、Hybrid、移动架构、React Native、性能优化等全面的Android高级实践技术讲解性能优化架构思惟导图,和BATJ面试题及答案!

群里免费分享给有须要的朋友,但愿可以帮助一些在这个行业发展迷茫的,或者想系统深刻提高以及困于瓶颈的朋友,在网上博客论坛等地方少花些时间找资料,把有限的时间,真正花在学习上,因此我在这免费分享一些架构资料及给你们。但愿在这些资料中都有你须要的内容。

相关文章
相关标签/搜索