Está en la página 1de 4

Optimizar sus interfaces

En cada creación de una actividad, se carga el layout asociado a esta actividad


(métodosetContentView o inflate). Esta carga puede ser muy costosa si la interfaz en cuestión está
mal diseñada o es muy pesada. Por este motivo Android proporciona muchos mecanismos para
optimizar las distintas interfaces que componen su aplicación.

1. Inspeccionar la jerarquía de sus interfaces


El primer método para optimizar interfaces Android consiste en inspeccionar la jerarquía de la vista en
cuestión. Para ello, el SDK Android proporciona una herramienta llamada HierarchyViewer (se
encuentra en la carpeta tools del SDK).

Para utilizar esta herramienta:

Inicie la aplicación en un emulador.

Muestre la actividad deseada (la que desea inspeccionar).

Arranque el HierarchyViewer.

Seleccione el proceso correspondiente a la aplicación en cuestión y, a continuación, haga clic


enLoad View Hierarchy.

Se mostrará un diagrama de la interfaz.

A continuación se muestra un ejemplo sencillo de un FrameLayout que contiene una imagen y un


texto.

<?xml version="1.0" encoding="utf-8"?>


<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/ic_launcher" />

</FrameLayout>

Se generará la siguiente vista:


La ejecución de la herramienta HierarchyViewer sobre la vista declarada anteriormente genera el
siguiente gráfico:

Puede observar que el FrameLayout que se ha declarado en la vista sigue a


otro FrameLayout(añadido automáticamente por Android tras la creación de una vista).

La conclusión es que el FrameLayout que se ha declarado es inútil y puede utilizar la


etiqueta<merge> para fusionar la vista (sin FrameLayout) con el FrameLayout declarado
automáticamente (véase la sección Fusionar layouts). Con ello, se optimiza la vista evitando la carga
de un layout innecesario.

2. Fusionar layouts
Android ofrece el tag <merge> para reducir y optimizar el número de niveles de una interfaz (véase
el ejemplo anterior). Esta optimización se realiza fusionando los componentes declarados tras
elmerge con el layout situado encima del merge.

Aplique dicha optimización al ejemplo anterior:

<merge
xmlns:android="http://schemas.android.com/apk/res/android">

<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="center"
android:src="@drawable/ic_launcher" />

</merge>

La etiqueta merge presenta algunas limitaciones:

Los layouts fusionados deben ser idénticos o tener el mismo comportamiento.

La etiqueta sólo puede usarse en la raíz de un archivo XML.

Cuando se utiliza la etiqueta merge, hay que especificar el layout padre con el que se
asociará la vista y definir el parámetro attachToRoot a verdadero.

3. Incluir vistas
Puede modularizar las interfaces para incluir y reutilizar vistas ya creadas en otras vistas. Gracias a la
etiqueta include que proporciona Android es posible usar esta funcionalidad.

Cuando la utilice, debe especificar:

Un identificador del layout incluido: para poder inicializarlo en la actividad y recuperar su


contenido.

El layout que se incluirá.

El siguiente ejemplo incluye en un LinearLayout otro layout declarado en otro archivo.

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<include
android:id="@+id/included_layout"
layout="@layout/main" />

<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello" />

</LinearLayout>

4. Carga perezosa (Lazy Loading) de layouts


La carga de una vista es muy costosa y, cuanto más elementos contiene, mayor es la duración. Para
minimizar el número de vistas cargadas en la creación de una interfaz puede utilizar la
claseViewStub.

Un ViewStub utiliza un mecanismo de carga perezosa. Cualquier elemento de la interfaz que se haya
declarado mediante un ViewStub sólo se cargará cuando se haga visible.

A continuación se muestra un ejemplo de una interfaz que contiene dos botones. El segundo se
declara en ViewStub y sólo se muestra tras hacer clic en el primer botón.

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/enable"
android:text="@string/enable_view_stub" />

<ViewStub
android:id="@+id/view_stub"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inflatedId="@+id/view_stub_visible"
android:layout="@layout/view_stub_btn" />

</LinearLayout>

De este modo, la declaración de un ViewStub se compone de:

Un identificador.

Un identificador cuando el ViewStub se haga visible.

El layout que el ViewStub cargará.

A continuación, declare el layout especificado por el ViewStub:

<?xml version="1.0" encoding="utf-8"?>


<Button
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/btn_stub" />

Para finalizar, hay que obtener el ViewStub y hacerlo visible tras hacer clic en el primer botón:

final View stub = findViewById(R.id.view_stub);

Button enable = (Button) findViewById(R.id.enable);


enable.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
stub.setVisibility(View.VISIBLE);
}
});

Una vista tiene tres tipos de visibilidad:

VISIBLE: la vista es visible.

INVISIBLE: la vista es invisible pero ocupa siempre el espacio que se le ha asignado.

GONE: la vista es invisible y no ocupa ni el espacio que se le ha asignado.

También podría gustarte