Documentos de Académico
Documentos de Profesional
Documentos de Cultura
UI en Android: Layouts 1
1.- Interfaz de usuario 1
2.- Layouts 1
3.- Formas de crear un layout 2
4.- Crear una UI en Android Studio 2
5.- Atributos de una vista 3
6.- Parámetros de una vista 4
7.- Tipos de layouts: 6
FrameLayout 6
LinearLayout 8
TableLayout 11
GridLayout 16
CoordinatorLayout y ConstraintLayout 21
8.- Editor visual de Android Studio 21
2.- Layouts
A la hora de crear el diseño para nuestras actividades es muy importante tener claro que son los
Layouts en Android.
Según la guía de desarrollo de Android Studio, se define un layout como una estructura visual
para una interfaz de usuario, es decir, aquello que hace de intermediario entre el terminal móvil y
el usuario.
Los layouts son un conjunto de contenedores donde podemos colocar una serie de elementos o
vistas (views) para establecer un orden visual.
Por ejemplo, dentro del layout podremos colocar botones, imágenes, textos, etc.
3.- Formas de crear un layout
En Android se pueden crear layout de dos formas: layouts creados a través de archivos XML, o
en las actividades con código Kotlin.
Lo recomendable es hacerlo por medio de archivos XML, ya que así el proyecto tiene una
estructura más organizada, se reduce tiempo en el diseño de la interfaz y ahorramos escribir todo
el código Kotlin que supone crear vistas de forma programática.
En ocasiones especiales, necesitaremos crear vistas desde nuestro código en Kotlin, por ejemplo,
cuando la vista se muestra de forma dinámica. Para este caso, se hará uso de las clases
ViewGroup y View.
- La clase View es un elemento visual que hace referencia a una vista. Cada elemento es un
objeto hijo de la clase View: TextView, EditView, etc.
- Mientras que ViewGroup es un elemento visual que se usa para contener a otros objetos
View y ViewGroup..
-
Por tanto, cuando haya que diseñar un layout con código Kotlin, habrá que usar el código
apropiado para añadir hijos, hasta crear el diseño deseado.
En la mayoría de los casos, se crearán los layouts haciendo uso de archivos XML.
Esto no quita que, en algunas ocasiones, necesitemos modificar mediante código Kotlin algunas
propiedades de elementos que hayamos creado por medio del XML.
- Esto quiere decir, que declarar los elementos de la UI en archivos XML es útil para crear
todo el aspecto visual que se usará en la app de forma estática.
- Pero si los elementos cambian por algún motivo cuando la app está en funcionamiento,
entonces se requiere código Kotlin para modificar dinámicamente los elementos de la UI.
Ambos métodos no son excluyentes.
Para crear un nuevo layout, click derecho sobre la carpeta layout > new > layout resource file
Cada layout se corresponderá con un archivo XML. En un layout existirá un elemento raíz que
puede ser un ViewGroup o un View. Dentro de un ViewGroup se pueden incluir otros View y
ViewGroup que definan una estructura de diseño de forma jerárquica.
Algunos de los ViewGroup que veremos son:
- FrameLayout - GridLayout
- LinearLayout - CoordinatorLayout
- TableLayout - ConstraintLayout
Para hacer referencia al archivo del layout, usamos la referencia que existe dentro de R.java que
contiene las referencias a todos los recursos de la aplicación. El código anterior, carga un layout
llamado activity_main.xml.
R.java
R.java es un archivo que se genera automáticamente al compilar nuestra App. Es un listado de
referencias a recursos de la App. Mediante un sistema de identificadores, podemos hacer
referencia a cualquier recurso de la App.
Desde una actividad, se accede escribiendo “R.” seguido del tipo de recurso y la id del recurso.
Por ejemplo, un layout llamado main_activity se accede escribiendo en la actividad
“R.layout.main_activity”.
La primera vez que se usa R en una actividad, hay que seleccionar a qué R nos referimos, que
será el paquete de nuestra App. Esto es porque existen otros paquetes R predefinidos con
recursos. Por ejemplo, android.R tiene sus propios recursos predefinidos (colores, imágenes,
estilos, etc).
Desde un layout en XML también se puede hacer referencia a otros recursos, pero se realiza de
forma distinta a cómo se ha hecho en una actividad.
Para este caso, se utiliza el caracter arroba “@” seguido del tipo de recurso y el identificador. Por
ejemplo, si tenemos una imagen en la carpeta drawable llamada “logo”, desde el layout se hará
referencia escribiendo “@drawable/logo”
Identificador de un view
Todos los elementos de un layout tienen un atributo en común llamado id. Es un identificador
único para cada elemento, que permite tener una referencia de cada objeto o vista.
Por ejemplo, teniendo el TextView (view para mostrar texto) del layout generado automáticamente
en Android Studio, supongamos que le asignamos un id para poder acceder a él desde la
actividad:
<TextView
android:id="@+id/texto_helloworld"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
La estrategia es sencilla: Simplemente en la actividad se declara un objeto del tipo View que se
busca y se le asigna el mismo id que tiene la vista en el layout. Recordad que esto se hace por
medio de R.java, que es el archivo donde Android guarda todas las referencias de los recursos.
“Cuando estés programando y escribas R.id., verás como Android studio despliega
todos los identificadores que existen hasta el momento.”
En la imagen, se muestra un layout cuyo elemento raíz es un LinearLayout. Sus 3 hijos (nivel 1) se
ajustan a los parámetros (LayoutParams) que éste les impone. Uno de los hijos es un
RelativeLayout que a su vez tiene 3 hijos. Las 3 vistas del nivel 2 estarán sometidas a los
parámetros del RelativeLayout.
Dependiendo del ViewGroup, así mismo será la naturaleza de los parámetros. Es decir, cada
ViewGroup tendrá sus propios parámetros de layout que afectarán de una manera u otra a sus
hijos. Aunque también existen parámetros que son comunes en todos los elementos, como se
verá a continuación.
layout_width y layout_height
Existen dos parámetros que son comunes en todos los elementos: layout_width y layout_height.
Estos parámetros definen el ancho y la altura de cualquier View.
Estos dos parámetros son de obligado uso en cualquier vista. Pueden tener 3 tipos de valores:
● wrap_content: Ajusta el tamaño al espacio mínimo que requiere el View, es decir, el
tamaño de la vista se ajusta al espacio que necesite.
Por ejemplo, si asignamos este valor al ancho y alto de un botón, el tamaño del botón será
el necesario para envolver el texto interior.
android:layout_width="wrap_content"
android:layout_height="wrap_content"
● match_parent: Ajusta el tamaño a las dimensiones máximas que la vista padre permita, es
decir, la vista aprovecha para ocupar todo el tamaño posible que pueda.
Por ejemplo, si en el mismo botón indicamos que el ancho sea match_parent, el ancho del
botón será todo aquel que le permita la vista padre.
android:layout_width="match_parent"
android:layout_height="wrap_content"
● valor numérico: Es posible asignar medidas absolutas al tamaño de las vistas. Se indica
mediante un valor numérico y la unidad. La unidad puede ser px (píxel) o dp (pixel de
densidad independiente). Éste último es una unidad flexible que escala una dimensión
uniforme en cualquier pantalla.
Lo más recomendable es dp, ya que la vista se mostrará con el mismo tamaño en
pantallas con densidades diferentes.
Por ejemplo, si queremos que nuestro botón tenga un ancho de 300dp:
android:id="@+id/button"
android:layout_width="300dp"
Un dp es igual a un píxel en una pantalla de densidad de 160 píxeles. Para calcular dp:
FrameLayout
Un FrameLayout es el más simple de todos los layouts de Android. El FrameLayout no realiza
ninguna distribución de sus vistas hijo, simplemente las coloca unas encima de otras, de forma
que la última vista agregada se mostrará en la parte superior.
Aunque el FrameLayout coloque una vista sobre otra, permite alinear las vistas dentro del layout.
Para ello, se usa el parámetro layout_gravity.
El parámetro gravity se basa en las posiciones comunes de un view dentro del layout. Se describe
con constantes de orientación:
- top: Indica la parte superior del layout.
- left: Indica la parte izquierda del layout.
- right: Se refiere a la parte derecha del layout.
- bottom: Representa el límite inferior del layout.
- center_horizontal: Centro horizontal del layout.
- center_vertical: Alineación al centro vertical del layout.
- center: Es la combinación de center_horizontal y center_vertical.
Es posible crear variaciones combinadas, como por ejemplo right + bottom. En código esta
combinación puedes representarla con un OR inclusivo.
android:layout_gravity=“right|bottom"
Ejemplo de FrameLayout:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/boton_saltar"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_gravity="center_horizontal|bottom"
android:text="Saltar" />
<ImageView
android:id="@+id/imagen_background"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="top|center"
android:scaleType="centerCrop"
android:src="@drawable/background_frame_layout" />
<ImageView
android:id="@+id/imagen_estadistica"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="16dp"
android:src="@drawable/ejemplo_estadistica" />
</FrameLayout>
LinearLayout
Un LinearLayout es un ViewGroup que distribuye sus hijos en una sola dirección establecida. Es
decir, o todos organizados en una sola columna (vertical) o en una sola fila (horizontal). La
orientación puedes ser establecida a través del atributo android:orientation.
LinearLayout también permite asignar una gravedad al igual que FrameLayout, mediante el
parámetro layout_gravity.
También existe otro parámetro llamado android:layout_weight, el cual define la importancia que
tiene un view dentro del LinearLayout. A mayor importancia, más espacio podrá ocupar.
Por ejemplo, la siguiente ilustración muestra tres views con pesos de 1, 2 y 3 respectivamente.
Matemáticamente, el espacio disponible total sería la suma de las alturas (6), por lo que 3
representa el 50%, 2 el 33,33% y 1 el 16,66%.
Para distribuir todos los elementos sobre el espacio total del layout, se puede usar el atributo
height con valor cero.
android:layout_height="0dp"
android:layout_weight="3"
Si no se hace así, la vista no ocupará el espacio total, si no que se definirá por las alturas que se
hayan definido. La vista quedaría así:
Ejemplo de LinearLayout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="48dp">
<TextView
android:id="@+id/texto_conectar"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:text="Conectar"
android:textAppearance="?android:attr/textAppearanceLarge" />
<EditText
android:id="@+id/input_usuario"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:hint="Correo" />
<EditText
android:id="@+id/input_contrasena"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:ems="10"
android:hint="Contraseña"
android:inputType="textPassword" />
<Button
android:id="@+id/boton_iniciar_sesion"
style="?android:attr/buttonStyleSmall"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:text="Iniciar Sesion" />
<TextView
android:id="@+id/texto_olvidaste_contrasena"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_gravity="center_horizontal"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="¿Olvidaste tu constraseña?"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="#0E8AEE" />
</LinearLayout>
TableLayout
Como su nombre indica, el TableLayout organiza sus vistas con aspecto de tabla, en filas y
columnas.
Para crear las filas se usa el componente TableRow dentro de TableLayout. Cada celda será un
view de cualquier tipo (imagen, texto, otro group view, etc.) dentro de la fila.
El TableRow tiene un parámetro llamado android:layout_column para asignar la columna a la
que pertenece cada celda en su interior. Incluso se puede usar el parámetro weight para declarar
pesos de las celdas.
El ancho de cada columna es definido tomando como referencia la celda más ancha. Pero
también se puede definir el comportamiento del ancho de las celdas con los siguientes atributos:
- android:shrinkColumns: permite marcar una o más columnas como “encogibles”, de forma
que su anchura se pueda reducir para adaptarse al tamaño del contenedor del TableLayout
En el ejemplo, se marca la columna 2 como “encogible”.
- android:stretchColumns: viene a ser la opuesta de la anterior, dado que permite que una
columna se expanda aumentando su anchura hasta que todo el contenido del TableLayout
ocupe la totalidad de la anchura de su contenedor.
En el ejemplo, en la captura 2 se asigna esta propiedad a la columna 3, y en la captura 3
tienen esta propiedad las columnas 1 y 3.
Ejemplo de TableLayout
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:stretchColumns="1">
<TableRow android:background="#128675">
<TextView
android:layout_column="0"
android:padding="3dp"
android:text="Producto"
android:textColor="@android:color/white" />
<TextView
android:layout_column="2"
android:padding="3dp"
android:text="Subtotal"
android:textColor="@android:color/white" />
</TableRow>
<TableRow>
<TextView
android:layout_column="0"
android:padding="3dp"
android:text="Jabón de manos x 1" />
<TextView
android:layout_column="2"
android:gravity="left"
android:padding="3dp"
android:text="$2" />
</TableRow>
<TableRow>
<TextView
android:layout_column="0"
android:padding="3dp"
android:text="Shampoo Monster x 1" />
<TextView
android:layout_column="2"
android:gravity="left"
android:padding="3dp"
android:text="$10" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="0"
android:padding="3dp"
android:text="Pastas Duria x 2" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="2"
android:gravity="left"
android:padding="3dp"
android:text="$18" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="0"
android:padding="3dp"
android:text="Detergente Limpiadin x 1" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="2"
android:gravity="left"
android:padding="3dp"
android:text="$13,4" />
</TableRow>
<View
android:layout_height="2dp"
android:background="#FF909090" />
<TableRow>
<TextView
android:layout_column="1"
android:padding="3dp"
android:text="Subtotal"
android:textColor="#128675" />
<TextView
android:id="@+id/textView7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="2"
android:layout_gravity="left"
android:gravity="right"
android:padding="3dp"
android:text="$43,4" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="1"
android:padding="3dp"
android:text="Costo envío"
android:textColor="#128675" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="2"
android:layout_gravity="left"
android:gravity="right"
android:padding="3dp"
android:text="$10" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="1"
android:padding="3dp"
android:text="Cupón"
android:textColor="#128675" />
<TextView
android:id="@+id/textView9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="2"
android:layout_gravity="left"
android:gravity="right"
android:padding="3dp"
android:text="-$5" />
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="1"
android:padding="3dp"
android:text="Total"
android:textColor="#128675" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_column="2"
android:layout_gravity="left"
android:gravity="right"
android:padding="3dp"
android:text="$48,4" />
</TableRow>
</TableLayout>
GridLayout
Un GridLayout es un ViewGroup que alinea sus elementos hijos en una cuadrícula (parrilla o
grid). Se creó para evitar anidar LinearLayouts para crear diseños complejos.
En la imagen mostrada al inicio, el GridLayout es una cuadrícula de 8×4 con 5 views. Sus atributos
span se encuentran escritos en de la forma axb. Como se puede ver, es posible expandir las
celdas de forma horizontal y vertical. Incluso es posible proyectar views de forma cruzada.
Si se observa bien, el elemento que se encuentra en la segunda fila con las especificaciones 1×2
se cruza en la columna 3. Esto se debe a que su ancho es de 3 unidades, per su atributo
columnSpan es igual a 2, lo que facilita al framework crear el cruce si existe espacio en blanco.
También puedes especificar a qué fila y columna pertenece cada view con los atributos
android:layout_row y android:layout_column.
El siguiente TextView se encuentra en la posición (0,0).
<TextView
android:id="@+id/celda_1"
android:layout_column="0"
android:layout_row="0"
android:text="Celda 1" />
Ejemplo de GridLayout
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alignmentMode="alignBounds"
android:columnCount="4"
android:rowCount="5">
<TextView
android:id="@+id/numero_7"
style="@style/AppTheme.BotonCalculadora.Azul"
android:layout_row="0"
android:layout_column="0"
android:text="7" />
<TextView
android:id="@+id/numero_8"
style="@style/AppTheme.BotonCalculadora.Azul"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="0"
android:layout_column="1"
android:text="8" />
<TextView
android:id="@+id/numero_9"
style="@style/AppTheme.BotonCalculadora.Azul"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="0"
android:layout_column="2"
android:text="9" />
<TextView
android:id="@+id/numero_4"
style="@style/AppTheme.BotonCalculadora.Azul"
android:layout_height="wrap_content"
android:layout_row="1"
android:layout_column="0"
android:text="4" />
<TextView
android:id="@+id/numero_5"
style="@style/AppTheme.BotonCalculadora.Azul"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="1"
android:layout_column="1"
android:text="5" />
<TextView
android:id="@+id/numero_6"
style="@style/AppTheme.BotonCalculadora.Azul"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="1"
android:layout_column="2"
android:text="6" />
<TextView
android:id="@+id/signo_por"
style="@style/AppTheme.BotonCalculadora.Rojo"
android:layout_row="1"
android:layout_column="3"
android:layout_gravity="fill"
android:gravity="center"
android:text="×" />
<TextView
android:id="@+id/textView10"
style="@style/AppTheme.BotonCalculadora.Rojo"
android:layout_row="0"
android:layout_column="3"
android:layout_gravity="fill_horizontal"
android:text="÷" />
<TextView
android:id="@+id/numero_1"
style="@style/AppTheme.BotonCalculadora.Azul"
android:layout_row="2"
android:layout_column="0"
android:text="1" />
<TextView
android:id="@+id/numero_2"
style="@style/AppTheme.BotonCalculadora.Azul"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="2"
android:layout_column="1"
android:text="2" />
<TextView
android:id="@+id/numero_3"
style="@style/AppTheme.BotonCalculadora.Azul"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_row="2"
android:layout_column="2"
android:text="3" />
<TextView
android:id="@+id/signo_menos"
style="@style/AppTheme.BotonCalculadora.Rojo"
android:layout_row="2"
android:layout_column="3"
android:layout_gravity="fill_horizontal"
android:gravity="center"
android:text="-" />
<TextView
android:id="@+id/punto"
style="@style/AppTheme.BotonCalculadora.Azul"
android:layout_row="3"
android:layout_column="0"
android:layout_gravity="fill_horizontal"
android:gravity="center_horizontal"
android:text="." />
<TextView
android:id="@+id/cero"
style="@style/AppTheme.BotonCalculadora.Azul"
android:layout_row="3"
android:layout_column="1"
android:text="0" />
<TextView
android:id="@+id/signo_igua"
style="@style/AppTheme.BotonCalculadora.Azul"
android:layout_row="3"
android:layout_column="2"
android:layout_gravity="fill_horizontal"
android:text="=" />
<TextView
android:id="@+id/signo_mas"
style="@style/AppTheme.BotonCalculadora.Rojo"
android:layout_row="3"
android:layout_rowSpan="2"
android:layout_column="3"
android:layout_gravity="fill"
android:text="+" />
<TextView
android:id="@+id/signo_igual"
style="@style/AppTheme.BotonCalculadora.Azul"
android:layout_row="4"
android:layout_column="0"
android:layout_columnSpan="3"
android:layout_gravity="fill_horizontal"
android:text="=" />
</GridLayout>
CoordinatorLayout y ConstraintLayout
Son dos layouts introducidos por Android posteriormente, es decir, no fueron definidos en las
primeras versiones de Android.
El CoordinatorLayout fue introducido con Material Design. Se podría decir que es como un super
FrameLayout, pero permite que sus elementos puedan realizar una serie de animaciones básicas.
En el lienzo se muestra una representación visual en tiempo real del layout. También una imagen
donde se muestran las guías y límites de cada elemento del layout.
En Attributes (panel de atributos) se muestran los atributos del elemento view que haya
seleccionado en la jerarquía de componentes. Permite cambiar las opciones de los atributos sin
tener que recurrir al código XML.
En la parte de variaciones del editor, podemos realizar varios cambios que afectarán al diseño
mostrado en el lienzo: