Developing Frogtek

El blog del Departamento de Tecnología

Etiqueta: xml

Hints en los EditText de Android

Esto va a ser un mini-post, pero me ha parecido interesante comentarlo ya que es algo de lo que hasta ahora, no me había dado cuenta.

Si estás programando en Android, seguramente te hayas encontrado con la siguiente situación:

Tienes un EditText vacío, que el usuario ha de completar, pero para darle más información sobre lo que debería ir en ese campo de texto, desearías poner un “hint”, una ayuda en forma de texto gris sobre el EditText.

Pero quieres que cuando se pinche sobre el campo editable, este texto desaparezca.

Se podría hacer todo por código, pero queda mucho más bonito y limpio un:

android:hint=”Introduzca Texto Aquí”

Simple y elegante.

El findViewById(), y lo cargante que puede llegar a ser

Si no vienes del post introductorio, quizás te gustaría leerlo.

Segundo asalto. La aplicación sigue estando lenta, y no sabemos muy bien por qué. Ya no hay tantos onMeasure(); sólo los “necesarios”. Pero hay una nueva función que aparece en los primeros puestos de nuestro querido traceview: findViewTraversal(). ¿Y quién llama tantísimas veces a esta última? pues findViewById().
Y es que esta función, es la que enlaza un recurso de la interfaz de usuario de una aplicación, con una variable en nuestro código. O simplemente se encarga de acceder a ese recurso para cambiar una de sus propiedades.

Supongamos, pues, que tenemos un layout con una veintena de widgets entre layouts, Buttons, EditText, TextView, ImageView… Y que en un momento dado del ciclo de vida de la actividad, tenemos que acceder a uno ó varios de ellos para cambiar sus propiedades. Podemos acceder a ellos del modo:
((EditText) this.findViewById(R.id.edittext_cliente)).setOnClickListener(…);
Aunque también podemos guardar el valor que devuelve la función findViewById() en una variable, o variable miembro de la Activity para operar con ella varias veces a lo largo del citado ciclo de vida.

¿Cuál es la diferencia? y ya que estamos ¿cuál era nuestro error? Pues que cada vez que se llama a la función findViewById(), android recorre todo el árbol jerárquico del Layout que hemos definido previamente en XML, en busca del recurso al que queremos acceder. Como ya habréis averiguado, el costo de esa operación es muy alto si el control a encontrar es de los últimos en el árbol, o si hay muchos niveles de layouts anidados, o simplemente queremos cambiar el valor de una de las propiedades de ese recurso bastantes veces a lo largo del ciclo de vida de la aplicación.
Si a esto le sumamos que el cambio en una de las propiedades de un EditText (por ejemplo), afecta a cinco o seis widgets más; y a todos accedemos del modo findViewById(), estamos vendidos.

La solución para una Activity, cuyos widgets han de ser modificados con bastante asiduidad es el guardar el resultado de la función archinombrada en este post en variables miembro, a las cuales se accederá sin tener que recorrer (findViewTraversal()) todo el árbol jerárquico “n” veces, con la consiguiente pérdida de velocidad en la transición de un estado a otro de la Activity.
Eso sí: Podemos prescindir de estas variables miembro si accedemos una, y sólo una, vez al widget en cuestión.

Esto también hay que grabarlo a fuego en la mente.

Optimizar una aplicación android (Introducción)

Hacía como mes y medio que quería escribir sobre este tema, pero me habría precipitado ya que desde esa fecha hasta ahora hemos aprendido mucho más sobre la optimización de una aplicación para android; aunque aún no quedan muchos conocimientos por adquirir.

Como ya hemos contado alguna vez, desde hace casi dos años, desarrollamos nuestro producto para teléfonos; teléfonos con una resolución fija. Y durante este verano, hemos dado el salto a una tablet. Suerte que todo el núcleo de la aplicación lo teníamos bien separado en un .jar. Por lo que el 2% del tiempo lo hemos invertido en retocar un poquito el núcleo, y el 95% restante ha sido armar una interfaz de usuario muy bonita, pero que nos ha dado bastantes quebraderos de cabeza, y que voy a intentar plasmar en una serie de posts.

Tras unas cuantas iteraciones y un empujón espectacular, teníamos muy avanzada la versión para la tablet. Pero el cambio de una pantalla de 320 x 480, a una de 800 x 480 conlleva problemas de memoria y de rendimiento (con un hardware superior al del teléfono, todo iba mucho más lento). Por que no es oro todo lo que reluce. Con un buen procesador, y bastante memoria no todo va a funcionar como pensabas. Por lo menos, en android. Nos hemos rascado mucho la cabeza, hemos sufrido, pero finalmente hemos aprendido muchas cosas; sobretodo de nuestros errores.

Es por ello, que nos gustaría compartir con vosotros los siguientes temas:

A medida que vayamos redactando la serie de posts, se actualizarán los puntos con enlaces a las URLs.

Usando estilos en Android

Ayer lo comentó Pablo en la oficina y no puedo estar más de acuerdo:

Cada día que pasa, estoy más convencido de estar programando CSS en lugar de android.

Programar la interfaz de usuario en Android tiene un cierto parecido a programar páginas webs.  Ya de por sí, en una aplicación Android, tenemos la vista separada del resto de la lógica, si usamos estilos en nuestros diseños, podremos además:

Reutilizar código: ¿Que es mejor? ¿Tener para cada elemento atributos que definan su estilo, atributos que posiblemente se repitan en elementos similares? ¿o crear un estilo que unifique todos esos atributos de forma que podamos reutilizarlos cada vez que queramos?

Tener un diseño homogéneo: ¿Os ha pasado de tener una aplicación en la que se tienen diferentes tamaños de letras para elementos similares? Seguramente en nuestra aplicación tengamos TextViewsEditTextsButtons y queremos que todos tengan la misma forma.

Usar estilos en Android es tan simple como:

-Crear un fichero .xml dentro de la carpeta values de nuestra aplicación. El nombre del fichero puede ser cualquiera, pero por claridad, podríamos llamarlo “style.xml”

-Dentro del fichero style.xml añadimos los diferentes bloques de estilos, muy parecido a lo que nos podemos encontrar en un fichero .css

  


    
    
     
     
    


Por otro lado, aplicaremos el estilo en el elemento que queramos.




De esta forma nos ahorramos muchas líneas de código.