android 封装状态页面,Android 缺省页状态切换方案

MultiStatePage

8b11c1e13126c072aefc5947faf22e33.gif

0fbd6b89563a30ed4654a3f76f074e2d.gif

MultiStatePage的功能及特点

无需在布局添加视图代码

可显示自定义状态视图,任意拓展

可用于 Activity、Fragment、或指定的 View

自定义重新请求监听

可动态更新视图样式

可结合第三方控件使用

支持状态回调监听

kotlin开发更易用的API

开始

添加依赖

Step1. Add the JitPack repository to your build file

allprojects {

repositories {

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

}

}

Step2. Add the dependency

753116e9-7da6-4c15-8fcc-c99a4e625dbf.svg.svg

dependencies {

implementation 'com.github.Zhao-Yan-Yan:MultiStatePage:1.0.7'

}

1.生成MultiStateContainer

在View上使用

kotlin

基础用法

val multiStateContainer = MultiStatePage.bindMultiState(view)

val multiStateContainer = MultiStatePage.bindMultiState(view) { multiStateContainer: MultiStateContainer ->

// 重试事件处理

}

拓展方法

val multiStateContainer = view.bindMultiState()

val multiStateContainer = view.bindMultiState() { multiStateContainer: MultiStateContainer ->

// 重试事件处理

}

java

MultiStateContainer multiStateContainer = MultiStatePage.bindMultiState(view)

MultiStateContainer multiStateContainer = MultiStatePage.bindMultiState(view, new OnRetryEventListener() {

@Override

public void onRetryEvent(MultiStateContainer multiStateContainer) {

// 重试事件处理

}

});

在Activity 根View中使用

kotlin

基础用法

val multiStateContainer = MultiStatePage.bindMultiState(this)

val multiStateContainer = MultiStatePage.bindMultiState(this) { multiStateContainer: MultiStateContainer ->

// 重试事件处理

}

拓展方法

val multiStateContainer = bindMultiState()

val multiStateContainer = bindMultiState() { multiStateContainer: MultiStateContainer ->

// 重试事件处理

}

java

MultiStateContainer multiStateContainer = MultiStatePage.bindMultiState(this);

MultiStateContainer multiStateContainer = MultiStatePage.bindMultiState(this, new OnRetryEventListener() {

@Override

public void onRetryEvent(MultiStateContainer multiStateContainer) {

// 重试事件处理

}

});

在Fragment根View中使用

kotlin

class MultiStateFragment : Fragment {

private lateinit var multiStateContainer: MultiStateContainer

override fun onCreateView(

inflater: LayoutInflater,

container: ViewGroup?,

savedInstanceState: Bundle?

): View? {

val root = inflater.inflate(R.layout.fragment, container, false)

multiStateContainer = MultiStatePage.bindMultiState(root) { multiStateContainer: MultiStateContainer ->

// 重试事件处理

}

//或者

multiStateContainer = root.bindMultiState() { multiStateContainer: MultiStateContainer ->

// 重试事件处理

}

return multiStateContainer

}

}

java

class JavaFragment extends Fragment {

@Nullable

@Override

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

View root = inflater.inflate(R.layout.activity_main, container, false);

MultiStateContainer multiStateContainer = MultiStatePage.bindMultiState(root);

return multiStateContainer;

}

}

2.切换状态

调用 MultiStateContainer.show() 方法

默认内置3种状态

val multiStateContainer = MultiStatePage.bindMultiState(view)

//成功页

multiStateContainer.show()

//错误页

multiStateContainer.show()

//空页面

multiStateContainer.show()

//加载状态页

multiStateContainer.show()

动态设置state

multiStateContainer.show{errorState ->

errorState.setErrorMsg("xxx出错了")

}

设置重试回调

val multiStateContainer = MultiStatePage.bindMultiState(view){

Toast.makeText(context, "retry", Toast.LENGTH_SHORT).show()

}

自定义State

1.继承MultiState

class LottieWaitingState : MultiState() {

override fun onCreateMultiStateView(

context: Context,

inflater: LayoutInflater,

container: MultiStateContainer

): View {

return inflater.inflate(R.layout.multi_lottie_waiting, container, false)

}

override fun onMultiStateViewCreate(view: View) {

//逻辑处理

}

//是否允许重试

override fun enableReload(): Boolean = false

//指定重试 view

override fun bindRetryView(): View? {

return retryView

}

}

enableReload() 是否允许retry回调 false不允许

bindRetryView 绑定重试点击事件的view 默认为根view

2.show (1.0.3后无需register)

class LottieExtActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

val multiStateContainer = bindMultiState()

multiStateContainer.show()

}

}

使用内置状态配置

class App : Application() {

override fun onCreate() {

super.onCreate()

val config = MultiStateConfig.Builder()

.alphaDuration(300)

.errorIcon(R.mipmap.state_error)

.emptyIcon(R.mipmap.state_empty)

.emptyMsg("emptyMsg")

.loadingMsg("loadingMsg")

.errorMsg("errorMsg")

.build()

MultiStatePage.config(config)

}

}

method作用

alphaDurationalpha动画时长

errorIcon错误状态默认图标

emptyIcon空数据状态默认图标

emptyMsg空数据状态默认提示信息

errorMsg错误状态默认提示信息

loadingMsgloading状态默认提示信息

小技巧

可以借助kotlin的拓展函数封装常用的状态

fun MultiStateContainer.showSuccess(callBack: (SuccessState) -> Unit = {}) {

show {

callBack.invoke(it)

}

}

fun MultiStateContainer.showError(callBack: (ErrorState) -> Unit = {}) {

show {

callBack.invoke(it)

}

}

fun MultiStateContainer.showEmpty(callBack: (EmptyState) -> Unit = {}) {

show {

callBack.invoke(it)

}

}

fun MultiStateContainer.showLoading(callBack: (LoadingState) -> Unit = {}) {

show {

callBack.invoke(it)

}

}

调用

val multiStateContainer = bindMultiState()

multiStateContainer.showLoading()

multiStateContainer.showSuccess()

更新日志

1.0.7(2020/11/26) 小优化 移除部分log打印

1.0.6(2020/11/06) 优化state切换策略 保留原view

1.0.5(2020/11/04) kotlin函数类型参数更换为java interface对java的调用更友好

1.0.4(2020/11/04) api重命名 Activity和View统一为bindMultiState()

1.0.3(2020/10/26) 修复state内存泄漏, 移除register函数

1.0.2(2020/10/23) 支持指定重试view, 支持ViewBinding

1.0.1(2020/09/22) 支持内置状态页信息配置, 支持alpha动画时长配置

Thanks

如果对你有帮助的话可以点个star支持一下子 谢谢亲

本项目会长期维护 欢迎issue指正

License

Copyright (C) 2020. ZhaoYan

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值