Layouts para versiones Portrait y Landscape

En esta entrada vamos a ver cómo crear versiones verticales (portrait) y horizontales (landscape) de los layouts para nuestras activitys o fragments, de forma que cuando se produzca un cambio de orientación en el dispositivo se seleccione la apropiada. Además veremos cómo determinar en tiempo de ejecución que orientación tenemos activa.


Android seleccionará automáticamente el layout portrait o landscape si los hemos creado apropiadamente. Como sabemos los layouts se almacenan en XML dentro de la carpeta layouts del proyecto. Si creamos un layout con el mismo nombre pero en la carpeta layouts-land entonces android seleccionará el layout de la carpeta -land. Si estamos en portrait seleccionará el layout con el mismo nombre de la carpeta layouts, a no se que tengamos la carpeta layouts-port.

Tenemos dos formas de crear la versión landscape de un layout.

  1. Utilizando al opción de menú Create Landscape Variation del editor de layouts (Ver imagen). Esto creará el layout con el sufijo -land, que podremos ver bajo la carpeta layouts-land (si estamos en la vista de proyecto)
  2. Creando a mano la carpeta layouts-land y copiar el layout que tenemos en la carpeta layouts.

Recordar que para ver las carpetas de layouts tenemos que estar en la vista Project Files, en la vista Android veremos los layouts con los sufijos correspondientes (-land, -port, o ninguno) todos bajo una carpeta genérica layouts.

Para crear la carpeta de layouts-land del proyecto tenemos dos opciones, ir al explorador de archivos del sistema operativo y crearla a mano, o podemos situarnos en el menú Res y con el menú contextual (botón derecho) usar New->Android Resource Directory

De esta forma podemos tener distintos layouts para portrait y landscape.

Podemos cambiar el aspecto y posición de los elementos del layout o crearlo totalmente distinto para ambas versiones, pero el id debe ser el mismo, puesto que Android lo tiene relacionado con a través de la clase R.

En el código, podemos determinar si estamos en portrait o landscape utiliziando el siguiente condicional:

 if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT ) {
	Toast.makeText(this,"Estamos en Portrait Mode",Toast.LENGTH_SHORT).show();
}
else{
	Toast.makeText(this,"Estamos en Landscape Mode",Toast.LENGTH_SHORT).show();
}