En esta lección, aprenderás a crear una interfaz de usuario mediante un layout en XML que incluirá un campo de texto y un botón. En la siguiente lección, tu app realizará la siguiente tarea: cuando el usuario presione el botón, el contenido del campo de texto será enviado a otra actividad.
La interfaz de usuario gráfica de una app Android se construye usando una jerarquía de Vistas (View) y Grupos de vistas (ViewGroup). Las View son normalmente widgets de la UI (interfaz de usuario) como botones o campos de texto. Los ViewGroup son contenedores invisibles de vistas que definen como las vistas dentro de ellos (vistas hijas) se ordenan, por ejemplo siendo una lista vertical o una lista en cuadrícula.
Android proporciona un vocabulario XML que corresponde a las subclases de View y ViewGroup para que puedas definir tu UI en XML usando una jerarquía de elementos de la UI.
Los layouts son subclases de los ViewGroup. En este ejercicio, trabajarás con LinearLayout.
Layouts Alternativos
Declarar un layout de la interfaz de usuario en XML en lugar de utilizar en código en tiempo de ejecución es útil por varias razones, pero es especialmente importante ya que puedes crear diferentes layouts para diversos tamaños de pantalla. Por ejemplo, puedes crear dos versiones de un layout y decirle al sistema que utilice uno en pantallas pequeñas, y el otro en pantallas grandes. Para más información, echa un vistazo a la lección Soporte de Diferentes Dispositivos.
Contenidos
Crear un Linear Layout
- En Android Studio, desde el directorio res/layout/, abre el archivo activity_my.xml.
- La plantilla BlankActivity que elegiste cuando creaste este proyecto incluye el archivo activity_my.xml con un RelativeLayout como vista raíz y una vista hija TextView.
- En el panel Preview, haz clic en el icono Hide para ocultar el panel de previsualización
- En Android Studio, cuando abres un archivo layout, lo primero que se muestra es el panel de previsualización. Hacer clic sobre estos elementos dentro del panel, abren las herramientas WYSIWYG en el panel de diseño. Para esta lección, trabajarás directamente sobre el código XML.
- Borra el <TextView> (TextView)
- Cambia el <RelativeLayout> a <LinearLayout>
- Añade el atributo<android:orientation> (orientación) e indica que es “horizontal”.
- Elimina el atributo android:padding y el atributo tools:context.
El resultado es
<LinearLayout 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" android:orientation="horizontal" > </LinearLayout>
LinearLayout
es un grupo de vistas (y es una subclase de ViewGroup
) que ordena las vistas en su interior en fila india o en línea, ya sea de forma vertical u horizontal, en función de como se especifique en el atributo android:orientation
. Cada vista hija de un LinearLayout
aparece en el orden en el orden en el que hayas escrito el código XML.
Los atributos android:layout_width
y android:layout_height
son necesarios para todas las vistas y sirven para especificar el tamaño de dichas vistas.
Como el LinearLayout
es la vista raíz, debería llenar todo el área del tamaño de la pantalla, así que es necesario seleccionar tanto la anchura (width) como la altura (height) como "match_parent"
. Este valor declara que la vista deberñia expandir su altura y anchura hasta encajar con el tamaño de la vista padre.
Para más información sobre las propiedades de un layout, visita la guía sobre Layouts.
Añadir un Campo de Texto
Como cualquier View
, debes definir diferentes atributos XML para especificar las propiedades del objeto EditText
(EditText).
- En el archivo
activity_my.xml
, dentro del elemento<LinearLayout>
, define un<EditText>
con el atributoid
como@+id/edit_message
. - Define tanto la anchura y altura
layout_width
ylayout_height
comowrap_content
. - Define el atributo
hint
como un objeto string llamadoedit_message
.
En definitiva, el elemento <EditText>
quedaría como:
<EditText android:id="@+id/edit_message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="@string/edit_message" />
Los atributos que has añadido al <EditText>
son:
android:id
- Proporciona una identidad única a la vista para que puedas hacer referencia a la misma desde el código de tu app, ya sea para leer o manipular el objeto (lo verás en la siguiente lección).
- El signo
@
se requiere cuando se hace referencia a un objeto de un recurso desde XML. Es seguido por el tipo de recurso, en este casoid
, un slash o barra oblicua y finalmente el nombre del recursoedit_message
. - El signo más
+
, antes del tipo de recurso es necesario solo cuando vas a definir un recurso de ID por primera vez. Cuando compiles la app, las herramientas del SDK usan la ID para crear un nuevo recurso de ID en el archivo de tu proyectogen/R.java
, el cual se refiere al elementoEditText
. Con el recurso de ID declarado una vez, las otras referencias a esta ID no necesitarán el signo más. Usar este signo es únicamente necesario para especificar un nuevo recurso de ID y no se necesita para recursos concretos como las strings (cadenas de texto) o los layouts. Abajo tienes más información sobre los objetos recurso.
android:layout_width
yandroid:layout_height
- En lugar de utilizar tamaños específicos para la anchura y altura, el valor “wrap_content”
"match_parent"
elEditText
rellenará toda la anchura de la pantalla, porque trataría de ajustarse al tamaño de la vista padre (el LinearLayout que indicamos que tuviese la misma anchura que la pantalla).
- En lugar de utilizar tamaños específicos para la anchura y altura, el valor “wrap_content”
android:hint
- Sirve para mostrar un texto por defecto cuando el campo de texto está vacío. En lugar de utilizar un texto directamente, se utilizará un recurso de string en un archivo separado definido como
"@string/edit_message"
. Como aún no has definido este recurso, si compilas la app obtendrías un error. Lo arreglaremos en la siguiente lección mediante la definición de un string.
- Sirve para mostrar un texto por defecto cuando el campo de texto está vacío. En lugar de utilizar un texto directamente, se utilizará un recurso de string en un archivo separado definido como
Objetos recurso
Un objeto recurso es un nombre entero único asociado con un recurso de la app, como puede ser un bitmap, un archivo layout o un string.
Cada recurso tiene un objeto recurso correspondiente definido en el archivo de tu proyecto
gen/R.java
. Puedes utilizar los nombres de objetos en la claseR
para referirte a tus IDs de recursos que están asociadas con la vista en la que utilizaste el atributoandroid:id
, el cual te permite referenciar la vista mediante código.Las herramientas del SDK generan el archivo
R.java
cada vez que compilas tu app. No deberías modificar jamás este archivo manualmente.Para más información, visita la guía Proporcionar Recursos.
Nota: Para más información sobre como utilizar la carpeta mipmap, visita Visión General de la Gestión de Proyectos.
Añadir Recursos de String
Por defecto, tu proyecto Android incluye un archivo recurso de strings en res/values/strings.xml
. Aquí, puedes añadir una nueva string llamada "edit_message"
y darle el valor "Enter a message"
.
- En Android Studio, desde el directorio
res/values
, abre el archivostring.xml
. - Añade una línea para una string llamada
"edit_message"
con el valor,"Enter a message"
. - Añade una línea para una string llamada
"button_send"
con el valor,"Send"
. Crearás el botón que utiliza esta string en la siguiente sección. - Elimina la línea con la string
"hello world"
.
El resultado es:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">My First App</string> <string name="edit_message">Enter a message</string> <string name="button_send">Send</string> <string name="action_settings">Settings</string> <string name="title_activity_main">MainActivity</string> </resources>
Para el texto en la interfaz de usuario, siempre especifica un string utilizando un recurso. Los recursos de string te permiten gestionar todos los textos en la UI en un mismo sitio, facilitándote encontrar cualquier texto fácilmente parra actualizarlo. Además, puedes utilizar archivos diferentes de strings para proporcionar diferentes idiomas en tu app.
Para más información sobre como utilizar los recursos de strings para ofrecer más idiomas en tu app, visita la lección Soporte de Diferentes Dispositivos.
Añadir un Botón
- En Android Studio, desde el directorio
res/values
, abre el archivoactivity_my.xml
- Dentro del
<LinearLayout>
, define un<Button>
detrás del<EditText>
. - Selecciona los atributos de altura y anchura a
"wrap_content"
para que el botón se ajuste al texto (e iconos si se diese el caso) en su interior. - Define el texto del botón con el atributo
android:text
; selecciona este valor al recurso de stringbutton_send
que definiste en la sección anterior.
El <LinearLayout>
debería verse así:
<LinearLayout 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" android:orientation="horizontal" > <EditText android:id="@+id/edit_message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="@string/edit_message" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_send" /> </LinearLayout>
Nota: Este botón no necesita el atributo
android:id
porque no se va le hará referencia desde el código de la actividad.
El layout actualmente está diseñando para que los widgets EditText
y Button
se ajusten a su contenido como se muestra en la figura 2.
Esto funcionará bien para el botón, pero no se verá demasiado bien en el campo de texto, porque el usuario puede escribir un texto más largo. Lo ideal es que el campo de texto ocupe todo el ancho de la pantalla que no se está utilizando. Puedes hacer esto mediante la propiedad weight dentro de un LinearLayout
, la cual puedes especificar utilizando el atributo android:layout_weight
.
El valor weight (carga, autoridad o peso), es un número que especifica la cantidad de espacio que cada vista debería utilizar, relativa a la cantidad utilizada por las vistas hermanas. Funcionará como la cantidad de ingredientes en una receta de una bebida: “dos partes de refresco y una parte de sirope” significa que dos tercios son de refresco. Por ejemplo, si tu tienes una vista con un peso de 2 y otra con un peso de 1, la suma de las dos es 3, luego la primera vista ocupará 2/3 del espacio y la secunda ocupará el resto. Si tu añades una tercera vista y le das un peso de 1, la primera vista ahora ocupará 1/2 del espacio (2/4), mientras que las dos restantes ocuparán 1/4.
Por defecto, todas las vistas tienen un peso de 0, así que si especificas un valor mayor de cero para una vista, esa vista llenará todo el espacio sobrante que no es requerido por el resto de vistas.
Modificar la Anchura del Campo de Texto
Para que el EditText
ocupe el espacio sobrante en tu layout, sigue los siguientes pasos:
- En el archivo
activity_my.xml
, asigna al atributolayout_weight
del<EditText>
el valor 1. - También, asigna al atributo
layout_width
del <EditText>el valor 0dp.
<EditText android:layout_weight="1" android:layout_width="0dp" ... />
Para mejorar la eficiencia del layout cuando especificas el peso, deberías cambiar la anchura del
EditText
a 0dp. Este ajuste mejora el rendimiento de tu layout, ya que usar"wrap_content"
como la anchura requiere que el sistema calcule la anchura la cual es irrelevante porque el valor del peso requiere otro calculo de anchura para rellenar el espacio en blanco.
El resultado final es:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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" android:orientation="horizontal"> <EditText android:id="@+id/edit_message" android:layout_weight="1" android:layout_width="0dp" android:layout_height="wrap_content" android:hint="@string/edit_message" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button_send" /> </LinearLayout>
Ejecutar tu App
Este layout se aplica por defecto en la clase Activity
que las herramientas del SDK generó cuando creaste el proyecto. Ejecuta tu app con una de las dos opciones siguientes para ver los resultados:
- En Android Studio, desde la barra de herramientas, haz clic en Run
- En una línea de comandos, dirígete al directorio raíz de tu proyecto Android y ejecuta:
ant debug adb install bin/MyFirstApp-debug.apk
Continúa con la siguiente lección par aprender como presionar un botón, leer el contenido del campo de texto, iniciar otra actividad y más.
Puedes ver más información sobre Crear una interfaz de usuario en la página oficial de Google en inglés pulsando aquí.