Posted by : Unknown
domingo, 3 de agosto de 2014
Recursos alternativos
Una aplicación Android va a poder ser ejecutada en una gran variedad de dispositivos. El tamaño de pantalla, la resolución o el tipo de entradas puede variar mucho de un dispositivo a otro. Por otra parte, nuestra aplicación ha de estar preparada para diferentes modos de funcionamiento, como el modo automóvil o el modo noche, y para poder ejecutarse en diferentes idiomas.
A la hora de crear el interfaz de usuario hemos de tener en cuenta todas estas circunstancias. Afortunadamente la plataforma Android nos proporciona una herramienta de gran potencia para resolver este problema, el uso de los recursos alternativos.
Práctica: Recursos alternativos en Mis Lugares
1. Ejecuta la aplicación creada en el punto anterior en el emulador.
2. Los teléfonos móviles basados en Android permiten cambiar la configuración en apaisado y en vertical. Para conseguir este efecto con el emulador pulsa Ctrl+F11. Si, usando un dispositivo pequeño observas el resultado de la vista que acabas de diseñar en vertical no queda todo lo bien que desearíamos.
Para resolver este problema Android te permite diseñar una vista diferente para la configuración horizontal y otra para vertical.
3. Crea la carpeta res/layout-land. Para ello puedes pulsa con el botón derecho sobre la carpeta res y seleccona New > Folder.
4. Copia en ella el fichero activity_main.xml.Para ello selecciona el fichero y pulsa Ctrl-C. Selecciona la carpeta destino y pulsa Ctrl-V.
5. Crea una vista similar a la que ves a continuación: formada por un LinearLayout que contiene un TextView y un TableLayout con dos Button por columna.
6. Ejecuta de nuevo la aplicación y observa como la vista se ve correctamente en las dos orientaciones.
Solución:
Has de obtener un código XML similar al siguiente:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="30dp"
tools:context=".MainActivity" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:gravity="center"
android:textSize="25sp"
android:layout_marginBottom="20dp"/>
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:stretchColumns="*">
<TableRow>
<Button android:id="@+id/Button01"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@string/accion_mostrar"/>
<Button android:id="@+id/Button02"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@string/accion_preferencias"/>
</TableRow>
<TableRow>
<Button android:id="@+id/Button03"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@string/accion_acerca_de"/>
<Button android:id="@+id/Button04"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@string/accion_salir"/>
</TableRow>
</TableLayout>
</LinearLayout>
NOTA: Para conseguir en un TableLayout, que las columnas se ajusten a todo el ancho de la tabla poner stretchColumns="*". stretchColumns="0"significa que asigne el ancho sobrante a la primera columna.stretchColumns="1"significa que asigne el ancho sobrante a la segunda columna. stretchColumns="*"significa que asigne el ancho sobrante entre todas las columnas.
Android utiliza una lista de sufijos para expresar recursos alternativos. Estos sufijos pueden hacer referencia a la orientación del dispositivo, al lenguaje, la región, la densidad de píxeles, la resolución, el método de entrada,…
Por ejemplo, si queremos traducir nuestra aplicación al inglés, español y francés. Siendo el primer idioma el usado por defecto, crearíamos tres versiones del fichero strings.xml y lo guardaríamos en los siguientes tres directorios:
res/values/strings.xml
res/values-es/strings.xml
res/values-fr/strings.xml
Ejercicio paso a paso: Traducción de Mis Lugares
1. Crea la carpeta res/values-en.
2. Copia en ella el fichero strings.xml.
3. Traduce en este fichero todas las cadenas al inglés.
4. Ejecuta la aplicación.
5. Vamos a cambiar la configuración de idioma den un dispositivo Android. Para ello, accede a Ajustes del dispositivo (Settings) y selecciona la opción Mi dispositivo > Idioma e introducción. Dentro de esta opción selecciona como idioma Español.
NOTA:Observa que en otros idiomas permite seleccionar tanto el idioma como la región. Por desgracia, para el español solo permite dos regiones España y Estados Unidos.
6. Observa cómo, ahora se ha traducido el texto.
7. ¿Qué pasaría si nuestra aplicación se ejecuta en un terminal configurado en chino? ¿Aparecerán las cadenas en castellano o en inglés? ¿Piensas que esta es una buena decisión de diseño? ¿Cómo lo podrías solucionar?
Respuestas: Aparecería en castellano. Mala decisión, mejor si aparece en inglés, que es un idioma conocido universalmente. Habría que poner el fichero strings.xml con los textos en ingles en la caspeta de recurso por defecto (res/values) y el fichero con los textos en castellano en la carpeta res/values-es.
8. Realiza los cambios propuestos en el punto anterior.
Otro ejemplo de utilización de recursos diferenciados lo podemos ver con el icono que se utiliza para lanzar la aplicación. Observa como, al crear una aplicación, este icono se crea en cinco carpetas drawable diferentes, para utilizar un icono distinto según la densidad de píxeles del dispositivo:
res/drawable-ldpi/ic_launcher.png
res/drawable-mdpi/ic_launcher.png
res/drawable-hdpi/ic_launcher.png
res/drawable-xhdpi/ic_launcher.png
res/drawable-xxhdpi/ic_launcher.png
NOTA:En el siguiente capítulo se describe porque se actua de esta manera..
Resulta posible indicar varios sufijos concatenados; por ejemplo:
res/values-en-rUS/strings.xml
res/values-en-rUK/strings.xml
Pero cuidado, Android establece un orden a la hora de encadenar sufijos. Puedes encontrar una lista de estos sufijos en el apendice C y en este enlace:
Para ver los sufijos disponibles también puedes pulsar con el botón derecho sobre una carpeta de recursos y seleccionar New > Other… > Android > Android XML File. Esta opción te permite crear un nuevo fichero XML y poner el sufijo deseado de forma y orden correcto.
Práctica: Creando un Layout para tabletas en Mis Lugares
Si ejecutas la aplicación Asteroides en una tableta observarás que los botones son demasiado alargados:
1. Trata de hacer un Layout alternativo a main.xml, que sea utilizado en pantallas de tamaño xlarge (7-10,5 pulgadas) en orientación land (apaisado). Simplemente poniendo un margen mayor en el Layout se conseguirá unos botones más proporcionados.
2. Si lo deseas también puedes personalizar el fondo de la pantalla (atributo background), los tamaños de letras, colores, etc.
3. Verifica que la aplicación se visualiza correctamente en todos los tipos de pantalla, tanto en horizontal como en vertical.
Solución:
1. Crea la carpeta layout-xlarge-land y copia en ella el fichero activity_main.xml.
2. En el nuevo fichero modifica el valor que se usa como margen interno:
<LinearLayout
…
android:padding="150dp"… >
En la siguiente sección trataremos de resolver de una forma más adecuada la asignación de este margen.
3. Ejecuta en un emulador o tableta real de 10 pulgadas y verifica que el resultado: