¿Qué es y qué hace LayoutInflater?

publicado por: Anonymous

Llevo poco más de un mes desarrollando en Xamarin, y pese a haber estudiado Android, hasta ahora no he tenido la oportunidad, o más bien, la necesidad de usar LayoutInflater.

Tuve hace poco un problema usando, o abusando de esta característica. Resuelto en esta pregunta: Textview no se añade a mi layout, el problema venía por usar el LayoutInflater cuando no debía.

He leído la documentación y en esta pone que instancia un layout xml a su view correspondiente. Lo que me lleva a pensar que cuando “inflo” un layout estoy creando un layout vacío a partir de ese XML.

En este articulo comparan un Layoutinflater con un hinchador de playa, entiendo la metáfora que dentro va el XML como gas y la pelota de playa sería la variable tipo vista/View dónde se carga ese XML

¿Esto es así? Sé que puede parecer sencillo, pero hay algo que me chirría en todo esto.

¿Que ventajas puede tener? ¿Cuando me puede convenir más usar Layoutinflater que asignar a una variable un FindViewById() y pasar directamente el layout?

solución

Te refieres a el LayoutInflater, en realidad inflater es el nombre de la variable que generalmente es usada para inflar un layout en Android:

LayoutInflater inflater = (LayoutInflater)this.GetSystemService(Context.LayoutInflaterService);
 var layout = inflater.Inflate(Resource.Layout.layout_elemento, layoutImages) as LinearLayout;

Para establecer una diferencia es necesario conocer las definiciones:

LayoutInflater Crea una instancia de un archivo XML de diseño en
sus objetos de vista correspondientes. Nunca se usa directamente. En
su lugar, usar
Context.getSystemService(Class) para recuperar una instancia de
LayoutInflater estándar que ya está conectada al contexto actual
y configurada correctamente para el dispositivo en el que se está
ejecutando.

FindViewById() Busca la primera vista descendiente con la ID
dada, la vista en sí misma si la ID coincide, o nula si
la ID no es válida (<0) o si no hay una vista coincidente en la
jerarquía.


Con respecto a tus preguntas:

comparan un Layoutinflater con un hinchador de playa, entiendo la
metáfora que dentro va el XML como gas y la pelota de playa sería la
variable tipo vista/View dónde se carga ese XML

¿Esto es así? Sé que puede parecer sencillo, pero hay algo que me
chirría en todo esto.

Es buena comparación, el “hinchador” infla el layout playa:

 View view =  LayoutInflater.Inflate(Resource.Layout.layout_playa, null);

pero dentro de esta vista (layout_playa) puedes encontrar elementos como pelota, sombrilla, lentes_sol:

<?xml version="1.0" encoding="utf-8" ?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">


        <ImageView
            android:id="@+id/pelota"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <TextView
            android:id="@+id/sombrilla"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
        <TextView
            android:id="@+id/lentes_sol"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

    </RelativeLayout >

Para acceder a estos elementos buscas en la vista que previamente inflaste mediante sus id haciendo uso de FindViewById(), ya que estos elementos se encuentran dentro de la vista :

 View view =  LayoutInflater.Inflate(Resource.Layout.layout_playa, null);
 ImageView img_pelota = view.FindViewById<ImageView>(Resource.Id.pelota);
 TextView tv_sombrilla = view.FindViewById<TextView>(Resource.Id.sombrilla);
 TextView tv_lentes = view.FindViewById<TextView>(Resource.Id.lentes_sol);

Es importante que las referencias de las vistas que obtengas mediante FindViewById() deben existir, de otra forma obtendrías valores null.


¿Que ventajas puede tener? ¿Cuando me puede convenir más usar
Layoutinflater que asignar a una variable un FindViewById() y pasar
directamente el layout?

En realidad su uso es diferente, LayoutInflater crea una instancia de un archivo XML de diseño en sus objetos de vista correspondientes y esta vista no necesita existir en el layout que de tu actividad pero si en los recursos mientras que para usar FindViewById() se usa para buscar vistas que se encuentran en un layout previamente inflado :

Otro ejemplo de LayoutInflater imagina que tienes que “inflar” un tipo de celda cuando la celda de tu listado es par y otro tipo cuando es impar:

public override View GetView(int position, View convertView, ViewGroup parent)
{

   View view = convertView;
   if (view == null) // no view to re-use, create new

    if (position % 2 == 1) {
       view  =  LayoutInflater.Inflate(Resource.Layout.layout_par, null);
    } else {
       view  =  LayoutInflater.Inflate(Resource.Layout.layout_impar, null);
    }

   }

    return view ;
}

como ejemplo de FindViewById(), buscas en dentro de un layout (layout_app) la referencia de una vista (TextView) mediante su id (Resource.Id.tv_titulo) y modificas alguna propiedad, en este caso asignas un texto.

 public override View GetView(int position, View convertView, ViewGroup parent)
        {

       View view = convertView;
       if (view == null) // no view to re-use, create new   
           view  =  LayoutInflater.Inflate(Resource.Layout.layout_par, null);
           TextView tv_sombrilla = view.FindViewById<TextView>(Resource.Id.sombrilla);

        tv_sombrilla.SetText("Aplicación Aritzbn");  
       }

        return view ;
    }
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *