Skip to content
一行代码配置缺省页, Android最强缺省页框架, 支持代码/布局声明/视图对象传递/全局单例配置/异常数据统一处理
Kotlin Java
Branch: master
Clone or download

Latest commit

Fetching latest commit…
Cannot retrieve the latest commit at this time.

Files

Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
app
gradle/wrapper
statelayout
.gitignore
README.md
build.gradle
gradle.properties
gradlew
gradlew.bat
settings.gradle

README.md

StateLayout

Android上最强大的缺省页(状态页面)工具

特点

  • 全局配置
  • 单例配置
  • 生命周期(可以加载动画或者处理事件)
  • 刷新回调
  • 获取当前缺省页状态
  • Loading缺省页支持进度回调
  • 支持activity/fragment/view替换
  • 支持Java或者XML实现
  • 无网络情况下showLoading显示错误布局, 有网则显示加载中布局
  • 支持配合RecyclerView的下拉刷新
  • 支持配合网络请求自动化显示
  • 异步线程显示缺省页
  • 可以将数据作为tag传给页面回调函数处理

配合网络请求库可以做到自动处理缺省页: Net

依赖

project 的 build.gradle

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

module 的 build.gradle

implementation 'com.github.liangjingkanji:StateLayout:1.0.11'

常见问题

先设置生命周期函数on**(), 再显示缺省页show**()才会执行生命周期函数

显示缺省页

showLoading(tag:Any? = null, refresh:Boolean = true) // 参数表示是否回调onRefresh函数
showEmpty(tag:Any? = null)
showContent(tag:Any? = null)
showError(tag:Any? = null)
  1. showLoading重复执行不会回调onRefresh, 但是会一直回调onLoading, 可以在其回调中进行进度变更

全局状态配置

或者也可以称为默认状态内容, 全局配置即以后都不需要在每个界面中指定缺省页显示内容, 都会默认读取全局配置. 如果不需要全局可以不写.

通过StateConfig单例对象控制

class MyApplication :Application(){
    override fun onCreate() {
        super.onCreate()

        StateConfig.apply {
            emptyLayout = R.layout.layout_empty
            errorLayout = R.layout.layout_error
            loadingLayout = R.layout.layout_loading

            onLoading {
                // do animation, this object = view object
            }
        }
    }
}

可配置项

  • 缺省页布局
  • 生命周期回调函数
  • 重试ids

生命周期函数

onError|onLoading|onEmpty系列函数, 每次在显示缺省页时都会执行. 一般情况是在回调中对布局中的视图进行设置动画

刷新回调

onRefresh函数在每次showLoading时候都会回调

onRefresh {
    thread {
        Thread.sleep(2000) // 模拟2s的网络请求
        showContent()
    }
}

showLoading()

重试Ids

errorLayout布局中的对应ids的视图对象会在点击时自动showLoading, 全局和单例都支持设置, 设置单例后全局就不会继续作用于当前缺省页.

fun setRetryIds(@IdRes vararg ids: Int)
  • 这是覆盖不是添加
  • 500ms内防止重复点击

单例状态配置

级别优先于全局状态配置

state = state().apply {
  emptyLayout = R.layout.layout_empty

  onError {
    // can retry request
  }
}

显示缺省页

通过show**函数

override fun onOptionsItemSelected(item: MenuItem): Boolean {
  when (item.itemId) {
    R.id.menu_loading -> state.showLoading()
    R.id.menu_content -> state.showContent()
    R.id.menu_error -> state.showError()
    R.id.menu_empty -> state.showEmpty()
  }
  return true
}

布局配置

StateLayout其实也可以在XML布局中声明创建

    <com.drake.library.StateLayout
        app:empty_layout="@layout/layout_empty"
        app:error_layout="@layout/layout_error"
        app:loading_layout="@layout/layout_loading"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        
        <!-- content -->
        
    </com.drake.library.StateLayout>

扩展

StateUtils文件中存在一系列基于Kotlin特性的工具函数, 用于快速创建一个StateLayout

fun Activity.state(): StateLayout

fun Fragment.state(): StateLayout

fun View.state(): StateLayout 

此框架同时被整合到我的RecyclerView库 BRV 中, 完美配合RecyclerView的缺省页和下拉刷新上拉加载.

并且在网络请求中可以达到自动化显示和隐藏缺省页, 查看库 Net

You can’t perform that action at this time.