Documentación

ZappBase es la librería con todos los componentes y utilidades que suelen compartir las aplicaciones que hacemos (BaseActivity, BaseFragment, BaseViewmodel...) así como la definición de estilos que usamos en la app. implementation com.zapp-studio:zappbase:

¿Por qué una librería?

En cada proyecto que iniciamos vamos mejorando las clases comunes que usamos, añadiendo funcionalidades o corrigiendo cosas. Estas mejoras siempre quedan en los proyectos más nuevos y cada vez que tenemos que retomar un proyecto antiguo no podemos utilizar las mejoras que hemos hecho si no es copiando/pegando los ficheros donde se han hecho esas mejoras.

Componentes de la librería

Indice

  • Componentes de UI

    1. #1---zappbaseapplication-enlace

    2. ZappBaseActivity (//TODO)

    3. ZappBaseApplication (//TODO)

  • Librerías de terceros

Componentes de UI

1 - ZappBaseApplication \(zappbase/src/main/java/com/zappstudio/zappbase/app/ui/context/ZappBaseApplication.kt\)

Clase que extiende de Application (android) donde incializamos las librerías RxJava (el error handler), RxPaparazzo, Firebase y Koin.

Al extenderla debemos definir los módulos de Koin que queremos que cargue sobrescribiendo el método getInjector.

Esta clase guarda el tamaño de la pantalla en las variables companion SCREEN_WIDTH y SCREEN_HEIGHT.

Spannables

La clase ZappSpannable se encargar de crear y gestionar los spannables de forma sencilla, para crear spannables de forma sencilla e idiomatica en kotlin tenemos que aprovechar las lambdas.

Ejemplo: Antes de usar kotlin lambdas para la construccion.

"<b>${country.currency} ${price}</b> <c><e>${oldPrice}</e>/${product.splitType.text}</c>"
.asSpannableByTags(
mutableMapOf(
Pair(
"b",
{
listOf(
getFontSpan(context, R.font.bold),
(getColorSpan(
ContextCompat.getColor(
context,
R.color.color15
)
) as CharacterStyle),
RelativeSizeSpan(1.1f)
)
}),
Pair(
"c",
{
listOf(
getFontSpan(context, R.font.light),
(getColorSpan(
ContextCompat.getColor(
context,
R.color.color16
)
) as CharacterStyle)
)
}),
Pair("e", { listOf(StrikethroughSpan() as CharacterStyle) })
)
)

Como se puede ver aunque esto mejora lo anterior de tener que crear todas las instancias y adjuntar a cada una de ella las posiciones del comienzo/final del spannable, esto rompe un poco que el codigo sea declarativo, obligandote a crear instancias como Pair.

Si usamos la clase SpannableFromTags directamente quedaría así:

SpannableFromTags {
addTag(
"b",
getFontSpan(context, R.font.bold),
getColorSpan(ContextCompat.getColor(this@MainActivity, R.color.color2)),
RelativeSizeSpan(1.1f)
)
addTag(
"c",
getColorSpan(
ContextCompat.getColor(
context,
R.color.color16
)
)
)
addTag(
"e",
StrikethroughSpan()
)
}
.build("<b>${country.currency} ${price}</b> <c><e>${oldPrice}</e>/${product.splitType.text}</c>")

Y usando la función quedaría así:

"<b>${country.currency} ${price}</b> <c><e>${oldPrice}</e>/${product.splitType.text}</c>".asSpannableFromTags {
addTag(
"b",
getFontSpan(context, R.font.bold),
getColorSpan(ContextCompat.getColor(this@MainActivity, R.color.color2)),
RelativeSizeSpan(1.1f)
)
addTag(
"c",
getColorSpan(
ContextCompat.getColor(
context,
R.color.color16
)
)
)
addTag(
"e",
StrikethroughSpan()
)
}

Un spannable realmente complejo se simplifica mucho, ademas se queda de forma completamente declarativa, para que de un vistazo se pueda comprender que esta haciendo.

iOS switch

Vista custom para recrear el switch tipo iOS con crossfade etc.

    <com.zappstudio.zappbase.app.ui.view.SwitchZapp
android:layout_width="70dp"
android:layout_height="35dp"
app:swBackgroundAnimationDuration="200"
app:swBackgroundColor="@color/selector_1"
app:swBallAnimationDuration="200"
app:swBallColor="@color/selector_0"
app:swBorderColor="@color/colorPrimary"
app:swBorderWidth="2dp"
app:swPadding="2dp"
app:switchChecked="@={result}" />

El tamaño del mismo es totalmente personalizable, siempre manteniendo la ratio 2:1 (el ancho es el doble del alto) Vease que switch checked es en realidad un binding custom two way implementado en zappbase.

SnapToBlock

Podemos utilizar este SpanHelper para tener un recycler view con paginación en la que cada página muestra más de un item.

Un ejemplo en el que añadimos todo lo necesario al recycler view para controlar la páginación y para controlar un PageViewIndicator:

  with(binding.rvNews){
layoutManager = newsLayoutManager
adapter = newsAdapter
val snapHelper = SnapToBlock(1)
snapHelper.attachToRecyclerView(this)

this.attachSnapHelperWithListener(
snapHelper,
SnapOnScrollListener.Behavior.NOTIFY_ON_SCROLL_STATE_IDLE,
object: OnSnapPositionChangeListener {
override fun onSnapPositionChange(position: Int) {
newsPageIndicator.selection = position / 2
}
}
)

}

Para controlar la cantidad de items que se muestran por página tenemos que utilizar un PercentLinearLayout y jugar con el ratio.

    private val newsLayoutManager = PercentLinearLayoutManager(0.46f, context, LinearLayoutManager.HORIZONTAL, false)

Librerías de terceros

Recursos Extra

Recyclerview ItemDecoration: https://github.com/grzegorzojdana/SpacingItemDecoration

All modules:

Link copied to clipboard

Este módulo configura un chat.

Link copied to clipboard
Link copied to clipboard

Módulo Para realizar algunos cambios necesarios en la librería de Pickit.

Link copied to clipboard

Módulo base de la librería.

Link copied to clipboard

Módulo base de la librería.

Link copied to clipboard

Módulo databinding de la librería.

Link copied to clipboard

Módulo para gestionar descargas.

Link copied to clipboard

Módulo para gestionar la localización.

Link copied to clipboard

Primero añades la librería a tu build.gradle

Link copied to clipboard

Módulo para crear un Swipe Menu.

Link copied to clipboard

Módulo para la gestión de Web Services