作者 |伪文艺大叔 地址 |http://www.jianshu.com/p/9d53893b3eda 效果图 前言在 Android 项目开发中一个界面的显示状态包括好几种:内容界面,loading 界面,网络错误界面等等;以前开发的时候都是直接把这些界面 include 到 main 界面中,然后动态去切换界面,后来发现这样处理不容易复用到其他项目中,而且在activity 中处理这些状态的显示和隐藏比较乱,所以就想着能不能封装一个类来管理这些状态 View 的切换。 1 思路 为了让 View 状态的切换和 Activity 彻底分离开,必须把这些状态 View 都封装到一个管理类中,然后暴露出几个方法来实现 View 之间的切换,因为在不同的项目中可以需要的 View 也不一样,所以考虑把管理类设计成 builder 模式来自由的添加需要的状态 View。 2 实现 通常一个界面会包括:内容,空数据,异常错误,加载,网络错误等 5 种状态的View,所以我们就设置这 5 种状态 View 的切换
状态管理类用到了建造者模式,上面是 builder 内部类,总共有 11 个属性,loadingLayoutResId 和 contentLayoutResId 代表等待加载和显示内容的 xml 文件;netWorkErrorVs,emptyDataVs,errorVs 代表另外几种异常状态,那为什么这几种状态要用 ViewStub,因为在界面状态切换中 loading 和内容 View 都是一直需要加载显示的,但是其他的 3 个只有在没数据或者网络异常的情况下才会加载显示,所以用 ViewStub 来加载他们可以提高性能。 在错误的几个界面需要重试按钮重新加载数据,netWorkErrorRetryViewId, emptyDataRetryViewId, errorRetryViewId 分别为几个状态界面重试按钮的 id, 如果这几个按钮的 id 是一样的话就直接给 retryViewId 属性赋值即可,retryViewId 优先级最高。 onShowHideViewListener 为状态 View 显示隐藏禁用词语事件 接下来需要把这些 View 添加到一个根 View 中返回给 Activity,为了方便显示隐藏这些 View,我们在根 View 中定义一个集合属性,然后把这些 View 添加到集合当中管理。
这个集合 Key 为 id,Value 为 View,id 为根 View 类内部自定义的 id,通过 id 找到对应的 View 来显示隐藏 View,下面通过一个方法来看下它的切换逻辑。
首先调用 inflateLayout 方法,方法返回 true 然后调用 showHideViewById 方法,
方法里面通过 id 判断来执行不同的代码,首先判断 ViewStub 是否为空,如果为空就代表没有添加这个 View 就返回 false,不为空就加载 View 并且添加到集合当中,然后调用 showHideViewById 方法显示隐藏 View,retryLoad 方法是给重试按钮添加事件,先来看看 showHideViewById 方法逻辑。
通过 id 找到需要显示的 View 并且显示它,隐藏其他 View,如果显示隐藏禁用词语事件不为空,就分别调用它的显示和隐藏方法,下面再来看看 retryLoad 方法。
可以看出 retryViewId 的优先级最好,如果它不为 0,就用它去查找 View 实例,然后如果 View 实例和重试禁用词语都不为空就添加点击事件,点击事件里调用onRetryListener 禁用词语的 onRetry 方法。 3 使用 StatusLayoutManager 提供了一系列的方法来显示不同布局 View 之间的切换。 github链接: https://github.com/chenpengfei88/StatusLayout code小生 简书:http://www.jianshu.com/u/645342ca3cad csdn:http://blog.csdn.net/wufeng55 分享技术 程序员不再猿 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|