para almacenar imágenes, layouts, valores, internacionalización, animaciones, menús, etc. • Provee diferentes versiones de los recursos según unos calificadores • Nombrar las carpetas de la siguiente forma: • <nombre_carpeta>-<calificador> • Puedes añadir más de uno pero respetando un orden. Ejemplos • drawable-hdpi: versión de alta densidad (~240dpi) • drawable-land-xhdpi: versión de extra alta densidad para el modo apaisado. (~320dpi) • values-es: Cadenas y valores cuando el locale es “es” (Español) • layout-large-land-car-night-finger-v11: Adivínalo! Más info: http://developer.android. com/guide/topics/resources/providing-resources.html Carpetas de recursos Pro tip Excluye recursos que empiecen por _ Tip Carpetas sin calificadores se consideran "por defecto"
Salvo que lo evites • Las diferentes versiones del mismo recurso deben tener el mismo nombre de archivo. • La misma view en distintas versiones del layout debe tener el mismo id. • Si el recurso no encaja con ningún calificador, Android busca el que mejor encaje. • Los recursos se acceden de dos formas: • En código: R.string.app_name • En XML: @string/app_name Manejo automático de recursos Pro tip Accede a los recursos de la plataforma con android.R.anim. fade_in o @android: anim/fade_in
independiente de la densidad es equivalente a un píxel físico en una pantalla de 160 dpi. • px = dp * (dpi / 160). Por ejemplo, en una pantall de 240 dpi, 1 dp equivalen a 1.5 píxeles físicos • Nunca NUNCA uses píxeles, usa dp en su lugar(o sp para tamaños de fuente). Soporte a distintas densidades de pantalla Tamaños relativos para bitmap drawables por densidad http://developer.android.com/guide/practices/screens_support.html
para diferentes dispositivos y "evitar" la fragmentación. Dando soporte a múltiples tamaños de pantalla • Screen madness: • Usa smallestWidth: sw<N>dp (sw480dp, sw600dp) • Calificadores de Android 3.2 para diferentes layouts • 320dp: típica pantalla de teléfono (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, etc). • 480dp: Tablet tipo Dell Streak (480x800 mdpi). • 600dp: tablet de 7” (600x1024 mdpi). • 720dp: tablet de 10”(720x1280 mdpi, 800x1280 mdpi, etc) res/layout/main_activity.xml # Para móviles (smaller than 600dp available width) res/layout-sw600dp/main_activity.xml # Para tablets de 7” (desde 600dp de ancho y más grandes) res/layout-sw720dp/main_activity.xml # Para tablets de 10” (desde 720dp de ancho y más grandes)
/res/layout • Tipos de contenedores: • LinearLayout: El más fácil de aprender. Muestra todas las vistas en horizontal o en vertical. • RelativeLayout: Posiciona las vistas relativas a otras vistas. Bueno para crear layouts que se solapan con transparencias. • FrameLayout: Layout básico. Apila las vistas una encima de otra. No muy útil. • También TableLayout y GridLayout Layouts eficientes
de la interfaz • (aka usa RelativeLayout) • Reusa layouts • Puedes usar <include/> para añadir otro layout <include android:id="@+id/cell1" layout=" @layout/workspace_screen" /> • Evita anidar contenedores del mismo tipo • Usa <merge/> • "Engancha" sus descendientes a su ancestro • Buen combo con <include/> Layouts eficientes (II)
áreas para estirar y áreas donde irá el contenido. • La imagen se expande para albergar el contenido manteniendo formas complejas de la imagen como son esquinas o adornos. Nine-patch Drawable • Arriba e izquierda • Define las áreas que se estiran (pero no se encogen!) • Abajo y derecha • Zona para el contenido, el resto es padding
los diferentes estados de la vista. • El orden es importante. El primero que encaje. • Independientes de la densidad. Almacenar en /res/drawable/btn_nav_bg_selector.xml State List Drawable <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_nav_forward_default" android:state_enabled="true" android:state_window_focused="false"/> <item android:drawable="@drawable/btn_nav_forward_disabled" android:state_enabled="false" android:state_window_focused="false"/> <item android:drawable="@drawable/btn_nav_forward_disabled" android:state_enabled="false" android:state_window_focused="true"/> <item android:drawable="@drawable/btn_nav_forward_pressed" android:state_pressed="true"/> <item android:drawable="@drawable/btn_nav_forward_pressed" android:state_enabled="true" android:state_focused="true"/> <item android:drawable="@drawable/btn_nav_forward_default" android:state_enabled="true"/> <item android:drawable="@drawable/btn_nav_forward_default" android:state_focused="true"/> <item android:drawable="@drawable/btn_nav_forward_default"/> </selector> Disabled Pressed Default android:background="@drawable/btn_nav_bg_selector"
otro en un solo drawable. • Útil para componer. • Level List • Similar al anterior pero solo muestra uno a la vez • Útil para estados no estándar (ej. un semáforo) • Transition drawable • Hace una transición con fundido entre dos drawables • drawable.startTransition(500); • Clip drawable • Recorta una porción de un drawable • Útil para personalizar barras de progreso • Scale drawable • Escala un drawable Otros drawables Más info: http://developer.android. com/guide/topics/resources/drawable-resource.html Layer List
concretas o a toda la aplicación • <activity android:theme="@style/Theme.Junaio"> • <application android:theme="@style/Theme.Junaio"> Temas <style name="Theme.Junaio" parent="android:Theme"> <item name="android:windowBackground">@null</item> <item name="android:windowNoTitle">true</item> <item name="android:windowFullscreen">false</item> <item name="android:buttonStyleToggle">@style/Topbar.Button</item> </style> Pro tip Los temas predefinidos no están bien documentados y pueden ser liosos. No hay consistencia de nombres buttonStyle buttonStyleToggle radioButtonStyle …