Si se requiere mostrar diferentes vistas dependiendo del contexto o información que se debe proyectar en pantalla, con StateLayout podremos controlar la carga de vistas en un proyecto. Para mostrar la pantalla de sin datos, la vista personalizada en caso de error, la vista de contenido etc...
Definición del componente dentro del layout.xml
<?xml version="1.0" encoding="utf-8"?>
<com.webserveis.app.testapp.views.StateLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/layout_state"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:view_empty="@layout/view_empty"
app:view_error="@layout/view_error"
app:animate="true"
app:animDuration="750"
app:view_loading="@layout/view_loading">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="This is the content." />
</com.webserveis.app.testapp.views.StateLayout>
- app:view_loading asigna la vista de carga
- app_view_empty asigna la vista sin datos
- app_view_error asigna la vista de error
- app:animate para establecer el cambio de vista con un fundido
- app:animDuration establece la duración del fundido
Para asignar una vista se usa el método .setViewForState
layout_state.setViewForState(StateLayout.STATE_LOADING, R.layout.view_loading)
Para cambiar de una vista a otra con el método .setState(State_id, animado)
layout_state.setState(StateLayout.STATE_LOADING, true)
Identificados predefinidos de StateLayout.STATE_
- STATE_CONTENT = 0
- STATE_LOADING = 1
- STATE_ERROR = 2
- STATE_EMPTY = 3
La segundo parámetro es opcional, es donde se especifica si el cambio de vista lo tiene que hacer mediante una animación de fundido, por defecto es false si no se indica lo contrario mediante la directiva en el componente xml app:animate=”true”
Si se desea se puede usar el método compacto
layout_state.content()
layout_state.loading()
layout_state.error()
layout_state.empty()
//con animación de fundido
layout_state.content(true)
layout_state.loading(true)
layout_state.error(true)
layout_state.empty(true)
Para asignar la velocidad de animación de fundido entre vistas, por defecto se establece en 350 milisegundos
layout_state.setAnimDuration(750L)
En la necesidad de querer personalizar una vista por ejemplo la vista de mostrar un error
Para personalizar el texto en tiempo de ejecución deberemos referirnos a los componentes que conforman la vista des de su view obtenido con layout_state.getView y luego con view?.findViewById se podrá importar el elemento
private fun showErrorUI(title: String, summary: String, @DrawableRes icon: Int? = null) {
val view = layout_state.getView(StateLayout.STATE_ERROR)
view?.findViewById<TextView>(R.id.error_title)?.text = title
view?.findViewById<TextView>(R.id.error_summary)?.text = summary
if (icon != null) view?.findViewById<ImageView>(R.id.error_icon)?.setImageResource(icon)
layout_state.setState(StateLayout.STATE_ERROR)
}
//Su uso
showErrorUI("SIN INTERNET","No hay conexión a internet")