Coder Social home page Coder Social logo

junixapp / statelayout Goto Github PK

View Code? Open in Web Editor NEW
175.0 6.0 22.0 1.72 MB

一种无侵入,使用简单,无需修改现有布局,动态切换布局状态(Loading/Error/Empty/Content)的解决方案。

Kotlin 99.37% Shell 0.63%
loadinglayout statelayout loading load status

statelayout's Introduction

StateLayout

Simple way to change your layout state, like loading, empty, error. Strong customizitaion, written by Kotlin.

Feature

  • 对已有布局零侵入,无需修改现有布局
  • 支持对Activity, Fragment, View进行状态切换
  • 支持自定义每种状态的布局
  • 暴露失败状态View点击回调
  • 暂时不支持对ConstraintLayout中的View进行状态切换

ScreenShot

StateLayout StateLayout

Gradle

implementation 'com.github.li-xiaojun:StateLayout:Tag'

别忘了添加根地址:

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

Usage

对Activity/Fragment使用:

val stateLayout = StateLayout(this)
            .wrap(this)
            .showLoading()

对指定View使用:

val layout2 = StateLayout(this)
            .wrap(view)
            .showLoading()

默认是显示内容布局,改变状态的方法:

stateLayout.showLoading()
stateLayout.showContent() //default state
stateLayout.showError()
stateLayout.showEmpty()

在布局中使用:

<com.lxj.statelayout.StateLayout
            android:id="@+id/slInLayout"
            android:layout_marginBottom="40dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView
                android:id="@+id/tvInLayout"
                android:gravity="center"
                android:text="测试布局中使用"
                android:background="#9f00"
                android:textColor="#fff"
                android:textSize="20sp"
                android:layout_width="match_parent"
                android:layout_height="150dp"/>
        </com.lxj.statelayout.StateLayout>

自定义每种状态对应的布局:

StateLayout(this)
    .config(loadingLayoutId = R.layout.custom_loading, //自定义加载中布局
            errorLayoutId = R.layout.custom_error, //自定义加载失败布局
            emptyLayoutId = R.layout.custom_empty, //自定义数据位为空的布局
            useContentBgWhenLoading = true, //加载过程中是否使用内容的背景,默认false
            enableLoadingShadow = true, //加载过程中是否启用半透明阴影盖在内容上面,默认false
            defaultShowLoading = true, //是否初始显示loading状态,默认显示的是Content
            enableTouchWhenLoading = true, //显示loading状态是否允许触摸,默认false
            noEmptyAndError = true, //是否去除Empty和Error状态,有时候只需要一个Loading状态,可以减少内存,默认false
            showLoadingOnce = false, //是否只显示一次Loading,在某些时候需要,默认false
            retryAction = { //点击errorView的回调
                Toast.makeText(this, "点击了重试", Toast.LENGTH_SHORT).show()
            })
    .wrap(view)
    .showLoading()

也可以全局配置,全局配置适用于所有的实例,但会被每个实例自己的配置覆盖:

StateLayoutConfig.init(...)

在Fragment中使用的时候需要注意下,要将StateLayout作为Fragment的View返回:

private var stateLayout: StateLayout? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    if (fragmentView==null) {
        fragmentView = inflater.inflate(getLayoutId(), container, false)
        stateLayout = StateLayout(context!!)
                .wrap(fragmentView)
                .showLoading()
    }
    return stateLayout
}

statelayout's People

Contributors

junixapp avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

statelayout's Issues

提个意见

不知这个是否支持DataBinding中使用,个人感觉好像不可以

有两个问题;约束布局和默认布局适配

java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to androidx.constraintlayout.widget.ConstraintLayout$LayoutParams

1.如果xml根布局是约束布局,会报以上强转错误;

2.默认布局传入指定view,view的大小如果过小,会导致显示不全,能不能适配自动缩小点

3.有没有java库啊,kotlin没用过

StateLayout用在Fragment时来回切换Fragment报异常

StateLayout用在Fragment时来回切换Fragment报异常

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

onCreateView里面重复wrap导致的

这种怎么解决

目前是判断stateLayout是否不为空, 不为空则跳过wrap

和约束布局配合会报错

当要wrap的View的父View是约束布局 运行时会报强制转换异常 希望能尽快修复
java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to androidx.constraintlayout.widget.ConstraintLayout$LayoutParams
at androidx.constraintlayout.widget.ConstraintLayout.getTargetWidget(ConstraintLayout.java:1144)
at androidx.constraintlayout.widget.ConstraintLayout.setChildrenConstraints(ConstraintLayout.java:1028)
at androidx.constraintlayout.widget.ConstraintLayout.updateHierarchy(ConstraintLayout.java:803)
at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1561)
at android.view.View.measure(View.java:20188)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6282)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:214)
at android.view.View.measure(View.java:20188)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6282)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1705)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:797)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:657)
at android.view.View.measure(View.java:20188)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6282)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:214)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:713)
at android.view.View.measure(View.java:20188)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2673)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1603)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1876)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1488)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7095)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:921)
at android.view.Choreographer.doCallbacks(Choreographer.java:723)
at android.view.Choreographer.doFrame(Choreographer.java:658)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:907)
at android.os.Handler.handleCallback(Handler.java:836)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:203)
at android.app.ActivityThread.main(ActivityThread.java:6406)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1113)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:974)

绑定Activity/Fragment 首次加载会有全屏遮挡

如题
每次在代码里执行加载效果,就会白屏或者黑屏全屏遮挡,再次通过点击事件加载会有地下的内容在,有个透明遮挡会有很多,如何做才能每次加载都是内容在底下,有个透明遮挡就好

loading能设置成类似于dialog的形式吗?

除了创建dialog的方式之外,还可以将背景色设置成透明实现需求,但是尝试了以下2种方式都无法将背景色设置为透明
stateLayout.setBackgroundColor(Color.TRANSPARENT) 和
stateLayout.background.alpha = 0

retryAction无回调

StateLayout.class
330 -> if(mRetryAction!=null)mRetryAction = retryAction
修改为
if(retryAction!=null)mRetryAction = retryAction

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.