Está en la página 1de 4

Optimizar sus interfaces

En cada creacin de una actividad, se carga el layout asociado a esta actividad


(mtodosetContentView o inflate). Esta carga puede ser muy costosa si la interfaz en cuestin est
mal diseada o es muy pesada. Por este motivo Android proporciona muchos mecanismos para
optimizar las distintas interfaces que componen su aplicacin.

1. Inspeccionar la jerarqua de sus interfaces


El primer mtodo para optimizar interfaces Android consiste en inspeccionar la jerarqua de la vista en
cuestin. Para ello, el SDK Android proporciona una herramienta llamada HierarchyViewer (se
encuentra en la carpeta tools del SDK).

Para utilizar esta herramienta:

Inicie la aplicacin en un emulador.

Muestre la actividad deseada (la que desea inspeccionar).

Arranque el HierarchyViewer.

Seleccione el proceso correspondiente a la aplicacin en cuestin y, a continuacin, haga clic


enLoad View Hierarchy.

Se mostrar un diagrama de la interfaz.

A continuacin 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 ejecucin de la herramienta HierarchyViewer sobre la vista declarada anteriormente genera el
siguiente grfico:

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


otro FrameLayout(aadido automticamente por Android tras la creacin de una vista).

La conclusin es que el FrameLayout que se ha declarado es intil y puede utilizar la


etiqueta<merge> para fusionar la vista (sin FrameLayout) con el FrameLayout declarado
automticamente (vase la seccin 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 nmero de niveles de una interfaz (vase
el ejemplo anterior). Esta optimizacin se realiza fusionando los componentes declarados tras
elmerge con el layout situado encima del merge.

Aplique dicha optimizacin 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 idnticos o tener el mismo comportamiento.

La etiqueta slo puede usarse en la raz 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 parmetro 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 ms elementos contiene, mayor es la duracin. Para
minimizar el nmero de vistas cargadas en la creacin 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 slo se cargar cuando se haga visible.

A continuacin se muestra un ejemplo de una interfaz que contiene dos botones. El segundo se
declara en ViewStub y slo se muestra tras hacer clic en el primer botn.

<?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 declaracin de un ViewStub se compone de:

Un identificador.

Un identificador cuando el ViewStub se haga visible.

El layout que el ViewStub cargar.

A continuacin, 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 botn:

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