Posted by : Unknown
domingo, 3 de agosto de 2014
Creación de una interfaz de usuario usando XML
En el ejemplo anterior hemos creado la interfaz de usuario directamente en el código. A veces puede ser muy complicado programar interfaces de usuario, ya que pequeños cambios en el diseño pueden corresponder a complicadas modificaciones en el código. Un principio importante en el diseño de software es que conviene separar todo lo posible el diseño, los datos y la lógica de la aplicación.
Android proporciona una alternativa para el diseño de interfaces de usuario: los ficheros de diseño basados en XML. Veamos uno de estos ficheros. Para ello accede al fichero res/layout/activity_main.xml de nuestro proyecto. Se muestra a continuación. Este layout o fichero de diseño proporciona un resultado similar que el ejemplo de diseño por código anterior:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
NOTA: Cuando haces doble clic en el Package Explorer sobre activity_main.xml, probablemente lo abra en modo Graphical Layout. Para verlo en modo texto selecciona la pestaña activity_main.xml.
Resulta sencillo interpretar su significado. Se introduce un elemento de tipo RelativeLayout, como se estudiará más adelante su función es contener otros elementos de tipo View. Este RelativeLayout tiene cinco atributos. Los dos primeros, xmlns:android,y xmlns:tools son declaraciones de espacios de nombres de XML que utilizaremos en este fichero (este tipo de parámetro solo es necesario especificarlo en el primer elemento). Los dos siguientes permiten definir el ancho y alto de la vista. En el ejemplo se ocupará todo el espacio disponible. El último atributo indica la actividad asociada a este Layout.
Dentro del RelativeLayout solo tenemos un elemento de tipo TextView. Este dispone de tres atributos. Los dos primeros definen el ancho y alto (se ajustará al texto contenido). El último indica el texto a mostrar. No se ha indicado un texto directamente sino una referencia, "@string/hello_world". Esta referencia ha de estar definida en el fichero res/values/strings.xml. Si abres este fichero, tienes el siguiente contenido:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Hola Mundo</string>
<string name="hello_world">Hello world!</string>
<string name="menu_settings">Settings</string>
</resources>
Esta es la práctica recomendada en Android para la inserción de textos en tu aplicación, dado que facilita su localización a la hora de realizar la traducción a otros idiomas. Es decir, utilizaremos los ficheros layout para introducir el diseño de los interfaces y el fichero strings para introducir los textos utilizados en los distintos idiomas.
Ejercicio paso a paso: Creación del Interfaz de usuario con XML
1. Para utilizar el diseño en XML regresa al fichero MainActivity.java y deshaz los cambios que hicimos antes (elimina las tres últimas líneas y quita el comentario).
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
2. Ejecuta la aplicación y verifica el resultado. Ha de ser muy similar al anterior.
3. Modifica elvalor de hello_world en el fichero res/values/strings.xml.
4. Vuelve a ejecutar la aplicación y visualiza el resultado.
Analicemos ahora la línea en la que acabas de quitar el comentario:
setContentView(R.layout.activity_main) ;
Aquí, R.layout.main corresponde a un objeto View que será creado en tiempo de ejecución a partir del recurso activity_main.xml. Trabajar de esta forma, en comparación con el diseño basado en código, no quita velocidad y requiere menos memoria. El plug-in de Eclipse crea automáticamente este identeficador en la clase R del proyecto a partir de los elementos de la carpeta res. La definición de la clase R puede ser similar a:
public final class R {
public static final class attr {
}
public static final class drawable {
public static final int ic_launcher=0x7f020000;
}
public static final class id {
public static final int menu_settings=0x7f070000;
}
public static final class layout {
public static final int activity_main=0x7f030000;
}
public static final class menu {
public static final int activity_main=0x7f060000;
}
public static final class string {
public static final int app_name=0x7f040000;
public static final int hello_world=0x7f040001;
...
NOTA: Este fichero se genera automáticamente. Nunca debes editarlo.
Has de tener claro que los identificadores de la clase R son meros números que informan al gestor de recursos, que datos ha de cargar. Por lo tanto no se trata de verdaderos objetos, estos serán creados en tiempo de ejecución solo cuando sea necesario usarlos.
Ejercicio paso a paso: El fichero R.java.
1. Abre el fichero llamado gen/com.example.holamundo/R.java de tu aplicación.
2. Comparalo con el fichero mostrado previamente. ¿Qué diferencias encuentras? (RESPUESTA: los valores numéricos en hexadecimal)
3. Abre el fichero MainActivity.java y reemplaza R.layout.activity_main por el valor numérico al que corresponde en R.java.
4. Ejecuta de nuevo el proyecto. ¿Funciona? ¿Crees que sería adecuado dejar este valor numérico?
5. Aunque haya funcionado, este valor puede cambiar en un futuro. Por lo tanto para evitar problemas futuros vuelve a reemplazarlo por R.layout.activity_main.