android 页面状态管理器,PageStatusTransformer:一种Android低入侵性的页面状态切换管理...

页面状态切换

03379feff9f7

PageStatusTransformer.gif

特性

构造自定义状态

val transformer =

PageStatusTransformer.newInstance {

"普通状态" {

SimpleStatus(contentView)

}

"加载中" {

MyLoadingPageStatus()

}

"没有数据" {

MyEmptyPageStatus()

}

//可以是任意字符串 "StatusName" { 对应的View }

//或者是任意枚举 Enum { 对应的View }

"数据错误" {

MyErrorPageStatus()

}

}

//当需要切换状态时,直接切换对应的状态名字:

transformer.transform("没有数据")

//或者枚举

transformer.transform(YourCustomEnum.Status1)

可以通过字符串或枚举自定义任意状态,无须受 showLoading showError 这种死板的接口约束,根据业务场景需要而构造当前页面的状态。

指定替换原来的 View

PageStatusTransformer.newInstance(

replaceTo = contentView /*contentView会被替换成同等大小的其他状态的ui*/

) {

Status1 {...}

Status2 {...}

}

通过可选参数 replaceTo 指定原有页面的 View ,当发生状态切换时,新状态的 View 会动态替换旧状态上的 View。所以无须在XML中放一个所谓的 StatusLayout,也无须把业务的状态都塞到 BaseActivity/BaseFragment 中。

支持不同方式的ui切换

PageStatusTransformer.newInstance(...) {

Status1 {

//`SimpleStatus` 只会改变View的可见性

//当需要显示这个状态时就Visible,当不需要的时候就Gone

SimpleStatus(view)

}

Status2 {

//`ViewStubStatus` 会在状态需要显示时才`inflate`对应的`ViewStub`

//当不需要的时候就Gone

ViewStubStatus(viewStub)

}

Status3 {

//`ReplacementViewStatus` 会在状态需要显示时通过 `addView` 添加到布局当中,

//在状态不需要的时候 `removeView` 移除

ReplacementViewStatus(view)

}

}

支持只改变状态ui的可见性,适用于长期存在于布局中的状态,比如数据正常时的状态。

支持当使用时才渲染的ViewStub,适用于懒加载布局中的状态。

支持动态添加和移除状态ui,适用于短暂存在于布局中的临时状态。

自定义状态的ui

PageStatusTransformer.newInstance(replaceTo = ...) {

"状态1" {

object: PageDisplayStatus {

override fun showView(){

//每次切换到`Status1`时都会触发

//完全自定义如何去显示这个状态

}

override fun hideView(){

//每次切换到除`Status1`以外的状态都会触发

//完全自定义如何去隐藏这个状态

}

}

}

"状态2" {

object: ReplacementViewStatus() {

override fun inflateView(inflater: LayoutInflater, parent: ViewGroup): View {

//切换到`Status2`时触发渲染一个新布局,并动态`addView`到`replaceTo`参数指定的位置

return inflater.inflate(...., parent, false)

}

//每次切换到`Status2`时都会触发

override fun onViewShow(){...}

//每次切换到除`Status2`以外的状态都会触发

override fun onViewHide(){...}

}

}

...

}

与其他方案对比

目前项目中使用的API都是类似于 showLoading(@resId int id, String text) ,但新一期需求设计出的loading提示/空数据提示/网络异常提示都是复杂的动画。以前的接口完全不能满足,而且对BaseFragment改动很大。一个本来很小的需求,就影响到接口设计,所以干脆重做了状态切换这一块。

所以千万不要把这些状态切换代码塞到 BaseFragment 中,千万不要把ui下沉,千万不要二次封装。

对Java支持

通过JavaViewStatusBuilder来把弱鸡Java适配到Kotlin DSL:

PageStatusTransformer transformer = PageStatusTransformer.newInstance(mRecyclerView,

new JavaViewStatusBuilder()

.putStatus("Normal", SimpleStatus(mRecyclerView))

.putStatus("Empty", YouCustomStatus("暂无数据"))

.putStatus("Error", YouCustomStatus("网络错误"))

.putStatus("Loading",YouCustomStatus("加载中"))

.build()

);

transformer.transform("Empty");

安装

allprojects {

repositories {

...

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

}

}

dependencies {

implementation 'com.github.YvesCheung:PageStatusTransformer:1.0.0'

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值