miércoles, mayo 13, 2015

Ley de gravitación universal Android

¿Se han preguntado por qué android tiene gravity y layout_gravity? Si no han sentido curiosidad, a continuación está la razón. 

Gravity


El atributo gravity afecta únicamente la gravedad interna del View. Supongamos que tenemos un botón con gravity "center", el resultado es el siguiente, cabe destacar que "center" es la gravedad default del botón.




Si cambiamos a "end" el resultado será el siguiente.





Si agregamos "|center_vertical" vamos a poder afectar la gravedad del View de dos maneras, vamos a alinear el texto del botón al final y a centro vertical del mismo.

El xml, es el siguiente.


<?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:gravity="center"
   android:orientation="horizontal" >
   <Button
       android:id="@+id/button1"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:gravity="end|center_vertical"
       android:text="@string/hello_world" />
</LinearLayout>

Al evaluar el XML, tenemos un layout vertical con gravedad center, lo cual centrará vertical y horizontalmente todo lo que esté dentro de el. Los siguiente no generará errores pero no tiene ningún sentido. 


<?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:gravity="center|center_vertical"
   android:orientation="horizontal" >

Aquí estamos diciendo, LinearLayout, por favor alinea todos tus hijos en mi centro y alinéalos también en mi centro vertical. En este caso debemos eliminar la opción center y dejar solo center_vertical

Layout Gravity

El atributo layout_gravity afecta la gravedad del View pero con respecto a su padre. Continuando con el ejemplo anterior, si aplicamos layout_gravity="end" al botón, éste se irá al fondo del LinearLayout.




<?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:gravity="center"
   android:orientation="vertical" >

   <TextView
       android:id="@+id/textView1"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/hello_world" />
 
   <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="end"
       android:gravity="center"
       android:text="@string/hello_world" />

</LinearLayout>


Al evaluar este xml, podemos ver que el LinearLayout le estamos diciendo, hey todos tus hijos van en mi centro, sin embargo el hijo rebelde llamado botón quiere ir a la derecha, y por lo tanto le podemos decir, ok, alinéate a la derecha de tu papá usando tu propiedad layout_gravity.