¿Por qué usar recursos?
En Android, los recursos son archivos externos al código: textos, colores, dimensiones, imágenes, layouts. Separarlos del código tiene ventajas clave:
- Localización: podés tener un
strings.xmlen español y otro en inglés, y Android elige automáticamente según el idioma del dispositivo. - Consistencia: si el color primario cambia, lo cambiás en un solo lugar.
- Adaptabilidad: podés tener recursos distintos para tablets, pantallas de alta densidad, modo oscuro, etc.
strings.xml
Todo texto visible al usuario debería vivir acá:
<!-- res/values/strings.xml -->
<resources>
<string name="app_name">Mi App</string>
<string name="boton_guardar">Guardar</string>
<string name="mensaje_bienvenida">Hola, %1$s! Tenés %2$d mensajes nuevos.</string>
<string name="error_campo_vacio">Este campo no puede estar vacío</string>
<!-- Plurales -->
<plurals name="cantidad_items">
<item quantity="one">%d item</item>
<item quantity="other">%d items</item>
</plurals>
</resources>
Usarlos en XML: android:text="@string/boton_guardar"
Desde Kotlin: getString(R.string.boton_guardar)
Con formato: getString(R.string.mensaje_bienvenida, "Carlos", 3)
Nunca hardcodees stringsEscribir texto directamente en XML o Kotlin (android:text="Guardar") funciona, pero rompe la localización y la mantenibilidad. Android Studio te avisa con un warning.
colors.xml
<!-- res/values/colors.xml -->
<resources>
<color name="primary">#1565C0</color>
<color name="primary_dark">#0D47A1</color>
<color name="accent">#FF6F00</color>
<color name="background">#FAFAFA</color>
<color name="text_primary">#212121</color>
<color name="text_secondary">#757575</color>
</resources>
En XML: android:textColor="@color/text_primary"
Desde Kotlin: ContextCompat.getColor(this, R.color.primary)
Dark modePara soporte automático de modo oscuro, creá un archivo res/values-night/colors.xml con los mismos nombres pero colores adaptados. Android elige el archivo correcto según la preferencia del sistema.
dimens.xml
Para espaciados, tamaños de texto y márgenes consistentes:
<!-- res/values/dimens.xml -->
<resources>
<dimen name="padding_normal">16dp</dimen>
<dimen name="padding_large">24dp</dimen>
<dimen name="text_size_body">16sp</dimen>
<dimen name="text_size_title">20sp</dimen>
<dimen name="card_corner_radius">8dp</dimen>
</resources>
En XML: android:padding="@dimen/padding_normal"
dp vs spdp (density-independent pixels) para dimensiones físicas: márgenes, padding, tamaños. sp (scale-independent pixels) para tamaños de texto: respeta la preferencia de tamaño de letra del usuario.
Acceder a recursos desde Kotlin
// Strings
val appName = getString(R.string.app_name)
val mensaje = getString(R.string.mensaje_bienvenida, "Carlos", 3)
val items = resources.getQuantityString(R.plurals.cantidad_items, count, count)
// Colores (usar ContextCompat para compatibilidad)
val color = ContextCompat.getColor(this, R.color.primary)
// Dimensiones
val padding = resources.getDimensionPixelSize(R.dimen.padding_normal)
// Drawables
val drawable = ContextCompat.getDrawable(this, R.drawable.ic_logo)
Calificadores de recursos
Android elige automáticamente el recurso adecuado según el contexto del dispositivo. Podés crear carpetas con calificadores:
values/— defaultvalues-es/— españolvalues-night/— modo oscurovalues-sw600dp/— tablets (600dp de ancho mínimo)drawable-hdpi/,drawable-xhdpi/— imágenes según densidad de pantallalayout-land/— layout específico para orientación horizontal
Esta es una de las características más poderosas del sistema de recursos de Android: escribís los calificadores una sola vez y Android hace el trabajo de selección automáticamente.