¿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.xml en 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/ — default
  • values-es/ — español
  • values-night/ — modo oscuro
  • values-sw600dp/ — tablets (600dp de ancho mínimo)
  • drawable-hdpi/, drawable-xhdpi/ — imágenes según densidad de pantalla
  • layout-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.