Android View to display different customizable states (Error, Empty, Permissions and etc.)
dependencies { implementation 'com.depoza.design:state-view:X.Y.Z' }
// 1. Create state val state = State( tag = "TAG_EMPTY_STATE_1", imgResId = R.drawable.ic_empty_state_1, title = "FIRST empty state title", subtitle = "First empty state subtitle", buttons = listOf( Button( text = "Action 1", textHexColor = "#FFFFFF", bgHexColor = "#773CA3", action = Button.Action(type = "custom", value = "ACTION_1") ) ) ) // 2. Request to display state stateView.apply(state)
// 1. Create list of states val states = listOf(state1, state2) // 2. Register available states stateView.states(states) // 3. Requests to display one of the registered states by tag stateView.apply("TAG_EMPTY_STATE_1")
// 1. Implement StatesProvider class MyStatesProvider : StatesProvider { val state1 = ... val state2 = ... override fun provide(context: Context) = listOf(state1, state2) }
<!-- 2. Declare attr 'states_provider'--> <com.depoza.design.state.StateView ... app:states_provider="com.example.MyStatesProvider"/>
stateView.buttonClickHandler { state: State, button: Button ->
when (button.action.value) {
"ACTION_1" -> stateView.apply("TAG_EMPTY_STATE_2")
"ACTION_2" -> stateView.apply("TAG_EMPTY_STATE_1")
}
}// 1. Create custom view and extends StateView // 2. Override method getLayoutResId() // 3. To save default logic use views with specific ids class MyAppStateView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = R.attr.stateViewStyle ) : StateView(context, attrs, defStyleAttr) { /** * Obtains layout resource id to inflate view from. * * Override if your want to provide custom layout. * To save default logic use views with ids: * - image with [@+id/img_state_view] * - title with [@+id/title_state_view] * - subtitle with [@+id/subtitle_state_view] * - buttons parent with [@+id/buttons_parent_state_view] */ override fun getLayoutResId() = R.layout.myApp_state_view }
<declare-styleable name="StateView"> <attr name="img_width" format="dimension"/> <attr name="img_height" format="dimension"/> <attr name="title_textAppearance" format="reference"/> <attr name="subtitle_textAppearance" format="reference"/> <attr name="states_provider" format="string"/> </declare-styleable>
<style name="Widget.MyApp.StateView" parent="Widget.Depoza.Design.StateView"> <item name="img_width">@dimen/myApp_img_width</item> <item name="img_height">@dimen/myApp_img_height</item> <item name="title_textAppearance">@style/TextAppearance.MyApp.Widget.StateView.Title</item> <item name="subtitle_textAppearance">@style/TextAppearance.MyApp.Widget.StateView.Subtitle</item> </style> <style name="TextAppearance.MyApp.Widget.StateView.Title" parent="TextAppearance.Depoza.Design.Widget.StateView.Title"> <item name="android:textSize">@dimen/myApp_title_txt_size</item> <item name="android:textColor">@color/myApp_title_color</item> </style> <style name="TextAppearance.MyApp.Widget.StateView.Subtitle" parent="TextAppearance.Depoza.Design.Widget.StateView.Subtitle"> <item name="android:textSize">@dimen/myApp_subtitle_txt_size</item> <item name="android:textColor">@color/myApp_subtitle_color</item> </style>
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="Theme.MyApp" parent="Theme.AppCompat"> <item name="stateViewStyle">@style/Widget.MyApp.StateView</item> </style> </resources>
If you want to register a set of available states into xml-layout by declaring attr 'states_provider'
-keep class * implements com.depoza.design.state.StatesProvider


