android. fragment activity时 视图为空?_UiStatus 一个简单且强大的 Android Ui 视图状态控制库...

code小生,一个专注 Android 领域的技术平台

公众号回复 Android 加入我的安卓技术群

作者:雪地里面晒太阳
链接:https://www.jianshu.com/p/895c9441c28b
声明:本文来自雪地里面晒太阳投稿,转发等请联系原作者授权

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

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

e52c9aae45dac067a7033e1cd4a4555e.gif
部分效果演示

优点:

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

0590bc506a43888830d5cf0c8f5d0112.png
status_load_error

e096b0a05ccbdbfd7665e5997e69e6b1.png

status_not_found

1f9dc736088324019dbd8f7585409df3.png

status_widget_network_error

28ae50ff28b5b258b2e2f0b53fe0838a.png

status_widget_float

1a632e760bedc497767ced16804e1fc7.png

status_widget_elfin

45bc328b5fc46fe31376a056cacd8f64.png

status_widget_elfin_2

最后附上github链接,喜欢的可以点个赞https://github.com/FengChenSunshine/UiStatus

智能推荐

MusicLibrary:一个丰富的音乐播放封装库

Android 基于 glide 4.0 封装图片加载库

少年郎,你需要封装好的 ViewPager 工具类

5f4bbb48ac3baba11b2f5a15765198b8.png

是时候该封装一个自己的库了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值