<?xml version="1.0" encoding="utf-8"?>
<com.github.daryl.library.StateLayout
android:id="@+id/state"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="daryl.library.MainActivity">
<LinearLayout
android:orientation="vertical"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/btnSubmit"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</com.github.daryl.library.StateLayout>
important: You should remain only ONE child inside StateLayout. For more children, use other layout container to host (LinearLayout / RelativeLayout / FrameLayout)
To custom statelayout, i.e, background color, icon drawable, text size, text color, etc, go to customization
To show loading...
fun callApi(){
state.showLoading()
// or
state.showLoading(message = "Loading.. Please wait")
// start aync task for api result.
// after result callback
state.dismissLoading()
}
To show empty
// list has empty item.
fun main(args: Array<String>) {
if (list.isEmpty){
state.showEmpty()
// or
state.showEmpty(
icon= empty_icon_drawable,
title = "No email left"
message = "Enjoy free day!"
)
// after items are added
state.dismissEmpty()
}
}
to show error, use showError() with onclick handling
// here we call api with retrofit and rx pattern.
fun callApi(){
val userService = retrofit.create<UserService>()
userService
.getUserList()
.retry(3)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe ({
// response code 200
state.dismissAllStates() // safe call to ensure all state views are gone.
// todo: other codes here
}, {
// response code != 200
state.showError {
// retry button onclick handling
toast("Server error. Please try again")
}
})
}
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="StateViews">
<attr name="loadingContent" format="string" />
<attr name="loadingImage" format="reference" />
<attr name="loadingContentTextSize" format="dimension" />
<attr name="loadingContentTextColor" format="color" />
<attr name="loadingProgressBarWidth" format="dimension" />
<attr name="loadingProgressBarHeight" format="dimension" />
<attr name="loadingProgressBarColor" format="color" />
<attr name="loadingBackgroundColor" format="color" />
<attr name="emptyTitle" format="string" />
<attr name="emptyContent" format="string" />
<attr name="emptyImage" format="reference" />
<attr name="emptyImageWidth" format="dimension" />
<attr name="emptyImageHeight" format="dimension" />
<attr name="emptyTitleTextSize" format="dimension" />
<attr name="emptyContentTextSize" format="dimension" />
<attr name="emptyTitleTextColor" format="color" />
<attr name="emptyContentTextColor" format="color" />
<attr name="emptyBackgroundColor" format="color" />
<attr name="errorTitle" format="string" />
<attr name="errorContent" format="string" />
<attr name="errorImage" format="reference" />
<attr name="errorImageWidth" format="dimension" />
<attr name="errorImageHeight" format="dimension" />
<attr name="errorTitleTextSize" format="dimension" />
<attr name="errorContentTextSize" format="dimension" />
<attr name="errorTitleTextColor" format="color" />
<attr name="errorContentTextColor" format="color" />
<attr name="errorStateButtonText" format="string" />
<attr name="errorButtonTextColor" format="color" />
<attr name="errorButtonBackgroundColor" format="color" />
<attr name="errorBackgroundColor" format="color" />
</declare-styleable>
</resources>
Version 2 - 20-2-2018
- add horizontal progress layout
- add constraint layout dependency
- add horizontal progress layout
- update anko version
- update gradle version to 3.0.1
- fix layout click event pass through to background layer