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---zappbaseapplication-enlace
-
ZappBaseActivity (//TODO)
-
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:
Este módulo configura un chat.
Módulo Para realizar algunos cambios necesarios en la librería de Pickit.
Módulo base de la librería.
Módulo base de la librería.
Módulo databinding de la librería.
Módulo para gestionar descargas.
Módulo para gestionar la localización.
Primero añades la librería a tu build.gradle
Módulo para crear un Swipe Menu.
Módulo para la gestión de Web Services