¿Qué hace LayoutInflater en Android?


Respuestas:


164

Cuando utiliza una vista personalizada en un ListViewdebe definir el diseño de la fila. Creas un xml donde colocas widgets de Android y luego en el código del adaptador tienes que hacer algo como esto:

public MyAdapter(Context context, List<MyObject> objects) extends ArrayAdapter {
  super(context, 1, objects);
  /* We get the inflator in the constructor */
  mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  View view;
  /* We inflate the xml which gives us a view */
  view = mInflater.inflate(R.layout.my_list_custom_row, parent, false);

  /* Get the item in the adapter */
  MyObject myObject = getItem(position);

  /* Get the widget with id name which is defined in the xml of the row */
  TextView name = (TextView) view.findViewById(R.id.name);

  /* Populate the row's xml with info from the item */
  name.setText(myObject.getName());

  /* Return the generated view */
  return view;
}

Lea más en la documentación oficial .


23
Idealmente, primero debe probar convertView para ver si puede reciclar un recurso, por lo tantoView view = convertView; if (view == null) { view = mInflater.... }
Jannie Theunissen

13
No creo que esta respuesta realmente explique qué LayoutInflateres un , aunque explica dónde usarlo. La respuesta 1 abajo es mejor.
James Ko

55
Esto no explica qué es un LayoutInflater. Explica cómo usarlo.
Donato

2
Estoy buscando la explicación de LayoutInflater.
Jugador1

@ Player1 Puedes consultar esta publicación
Bertram Gilfoyle

284

La clase LayoutInflater se usa para crear instancias del contenido de los archivos XML de diseño en sus correspondientes objetos de vista.

En otras palabras, toma un archivo XML como entrada y construye los objetos Ver a partir de él.


75
Lo que estaba buscando es la parte "en otras palabras", ya que la parte superior ya está en los documentos API
Nipuna

1
Esto todavía me parece bastante abstracto. Entonces, digamos que tengo un single_list_item.xmlarchivo para cada línea de a ListView. ¿Es el uso de ese archivo XML como un inflador?
JohnK

169

¿Qué LayoutInflatorhacer?

Cuando comencé la programación de Android, estaba realmente confundido por LayoutInflatery findViewById. Algunas veces usamos una y otras la otra.

  • LayoutInflaterse usa para crear un nuevo View(o Layout) objeto a partir de uno de sus diseños xml.
  • findViewByIdsolo le da una referencia a una vista que ya se ha creado. Se podría pensar que usted no ha creado ninguna vistas aún, pero siempre que se ponga setContentViewen onCreate, el diseño de la actividad junto con sus subvistas se infla (creada) por detrás de las escenas.

Entonces, si la vista ya existe, use findViewById. Si no es así, créelo con a LayoutInflater.

Ejemplo

Aquí hay un mini proyecto que hice que muestra ambos LayoutInflatery findViewByIden acción. Sin un código especial, el diseño se ve así.

ingrese la descripción de la imagen aquí

El cuadrado azul es un diseño personalizado insertado en el diseño principal con include(vea aquí para más información). Se infló automáticamente porque es parte de la vista de contenido. Como puede ver, el código no tiene nada de especial.

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

Ahora inflemos (creemos) otra copia de nuestro diseño personalizado y agréguela.

ingrese la descripción de la imagen aquí

LayoutInflater inflater = getLayoutInflater();
View myLayout = inflater.inflate(R.layout.my_layout, mainLayout, false);

Para inflar el nuevo diseño de la vista, todo lo que hice fue decirle al inflador el nombre de mi archivo xml ( my_layout), el diseño principal al que quiero agregarlo ( mainLayout), y que en realidad no quiero agregarlo todavía ( false) . (También podría establecer el padre en null, pero luego se ignorarían los parámetros de diseño de la vista raíz de mi diseño personalizado).

Aquí está nuevamente en contexto.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // inflate the main layout for the activity
        setContentView(R.layout.activity_main);

        // get a reference to the already created main layout
        LinearLayout mainLayout = (LinearLayout) findViewById(R.id.activity_main_layout);

        // inflate (create) another copy of our custom layout
        LayoutInflater inflater = getLayoutInflater();
        View myLayout = inflater.inflate(R.layout.my_layout, mainLayout, false);

        // make changes to our custom layout and its subviews
        myLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.colorAccent));
        TextView textView = (TextView) myLayout.findViewById(R.id.textView);
        textView.setText("New Layout");

        // add our custom layout to the main layout
        mainLayout.addView(myLayout);
    }
}

Observe cómo findViewByIdse usa solo después de que un diseño ya se ha inflado.

Código Suplementario

Aquí está el xml para el ejemplo anterior.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main_layout"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <!-- Here is the inserted layout -->
    <include layout="@layout/my_layout"/>

</LinearLayout>

my_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:background="@color/colorPrimary">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:padding="5dp"
        android:textColor="@android:color/white"
        android:text="My Layout"/>

</RelativeLayout>

¿Cuándo necesita LayoutInflater?

  • El momento más común que la mayoría de la gente usa es en a RecyclerView. (Consulte estos RecyclerViewejemplos para obtener una lista o una cuadrícula ). Debe inflar un nuevo diseño para cada elemento visible en la lista o cuadrícula.
  • También puede usar un inflador de diseño si tiene un diseño complejo que desea agregar mediante programación (como lo hicimos en nuestro ejemplo). Podría hacerlo todo en código, pero es mucho más fácil definirlo primero en xml y luego simplemente inflarlo.

22
Una explicación mucho, mucho mejor que la respuesta marcada como la solución. A veces la vida no es justa.
Steve Wellens

Hola señor, si tengo más de una vista dentro de main_activity.xml, entonces ¿cómo puedo configurar la vista external.xml en main_activity con center layout_gravity.
Príncipe

1
Esta debería ser la respuesta aceptada. Tan fácil de entender para cualquier principiante.
Mr Cold

¿Mylayout es un tipo de vista o un tipo de diseño lineal?
HS Singh

@HSSingh, myLayoutes una Vista, aunque podría haberla inflado como RelativeLayout (ver my_layout.xml). Después de que se infla, lo agrego como una subvista del padre LinearLayout (es decir, mainLayout).
Suragch

31

LayoutInflater.inflate () proporciona un medio para convertir un archivo res / layout / *. Xml que define una vista en un objeto View real que se puede usar en el código fuente de su aplicación.

dos pasos básicos: obtener el inflador y luego inflar el recurso

¿Cómo se obtiene el inflador?

LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

¿Cómo se obtiene la vista suponiendo que el archivo xml es "list_item.xml"?

View view = inflater.inflate(R.layout.list_item, parent, false);

22

Aquí hay otro ejemplo similar al anterior, pero ampliado para demostrar aún más los parámetros de inflado y el comportamiento dinámico que puede proporcionar.

Suponga que su diseño de fila ListView puede tener un número variable de TextViews. Entonces, primero infla la vista del elemento base (al igual que en el ejemplo anterior) y luego realiza un bucle de forma dinámica agregando TextViews en tiempo de ejecución. Usando android: layout_weight adicionalmente alinea todo perfectamente.

Aquí están los recursos de diseños:

list_layout.xml

<?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="wrap_content" 
    android:orientation="horizontal" >
    <TextView 
        android:id="@+id/field1"
        android:layout_width="0dp"  
        android:layout_height="wrap_content" 
        android:layout_weight="2"/>
    <TextView 
        android:id="@+id/field2"
        android:layout_width="0dp"  
        android:layout_height="wrap_content" 
        android:layout_weight="1"
/>
</LinearLayout>

schedule_layout.xml

<?xml version="1.0" encoding="utf-8"?>
   <TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="0dp"  
    android:layout_height="wrap_content" 
    android:layout_weight="1"/>

Anular el método getView en la extensión de la clase BaseAdapter

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = activity.getLayoutInflater();
    View lst_item_view = inflater.inflate(R.layout.list_layout, null);
    TextView t1 = (TextView) lst_item_view.findViewById(R.id.field1);
    TextView t2 = (TextView) lst_item_view.findViewById(R.id.field2);
    t1.setText("some value");
    t2.setText("another value");

    // dinamically add TextViews for each item in ArrayList list_schedule
    for(int i = 0; i < list_schedule.size(); i++){
        View schedule_view = inflater.inflate(R.layout.schedule_layout, (ViewGroup) lst_item_view, false);
        ((TextView)schedule_view).setText(list_schedule.get(i));
        ((ViewGroup) lst_item_view).addView(schedule_view);
    }
    return lst_item_view;
}

Observe diferentes llamadas al método de inflado:

inflater.inflate(R.layout.list_layout, null); // no parent
inflater.inflate(R.layout.schedule_layout, (ViewGroup) lst_item_view, false); // with parent preserving LayoutParams

12

Esta clase se usa para crear instancias del archivo XML de diseño en sus Viewobjetos correspondientes . Nunca se debe usar directamente: use getLayoutInflater()o getSystemService(String)para recuperar una LayoutInflaterinstancia estándar que ya está conectada al contexto actual y configurada correctamente para el dispositivo en el que se está ejecutando. Por ejemplo:

LayoutInflater inflater = (LayoutInflater)context.getSystemService
      (Context.LAYOUT_INFLATER_SERVICE);

Referencia: http://developer.android.com/reference/android/view/LayoutInflater.html


2
Esto puede ser cierto pero no responde la pregunta.
Sinthia V

8

Inflar significa leer el archivo XML que describe un diseño (o elemento GUI) y crear los objetos reales que le corresponden, y así hacer que el objeto sea visible dentro de una aplicación de Android.

final Dialog mDateTimeDialog = new Dialog(MainActivity.this);

// Inflate the root layout
final RelativeLayout mDateTimeDialogView = (RelativeLayout) getLayoutInflater().inflate(R.layout.date_time_dialog, null);

// Grab widget instance
final DateTimePicker mDateTimePicker = (DateTimePicker) mDateTimeDialogView.findViewById(R.id.DateTimePicker);

Este archivo podría guardarse como date_time_dialog.xml :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/DateTimeDialog" android:layout_width="100px"
    android:layout_height="wrap_content">
    <com.dt.datetimepicker.DateTimePicker
            android:id="@+id/DateTimePicker" android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    <LinearLayout android:id="@+id/ControlButtons"
            android:layout_width="fill_parent" android:layout_height="wrap_content"
            android:layout_below="@+id/DateTimePicker"
            android:padding="5dip">
            <Button android:id="@+id/SetDateTime" android:layout_width="0dip"
                    android:text="@android:string/ok" android:layout_weight="1"
                    android:layout_height="wrap_content"
                   />
            <Button android:id="@+id/ResetDateTime" android:layout_width="0dip"
                    android:text="Reset" android:layout_weight="1"
                    android:layout_height="wrap_content"
                    />
            <Button android:id="@+id/CancelDialog" android:layout_width="0dip"
                    android:text="@android:string/cancel" android:layout_weight="1"
                    android:layout_height="wrap_content"
                     />
    </LinearLayout>

Este archivo podría guardarse como date_time_picker.xml :

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="wrap_content" `enter code here`
    android:padding="5dip" android:id="@+id/DateTimePicker">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:baselineAligned="true"
android:orientation="horizontal">

    <LinearLayout
    android:id="@+id/month_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="1dp"
    android:layout_marginTop="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginBottom="5dp"
    android:gravity="center"
    android:orientation="vertical">
    <Button
        android:id="@+id/month_plus"
        android:layout_width="45dp"
        android:layout_height="45dp"  
        android:background="@drawable/image_button_up_final"/>
    <EditText
        android:id="@+id/month_display"
        android:layout_width="45dp"
        android:layout_height="35dp"
        android:background="@drawable/picker_middle"
        android:focusable="false"
        android:gravity="center"
        android:singleLine="true"
        android:textColor="#000000">
    </EditText>
    <Button
        android:id="@+id/month_minus"
        android:layout_width="45dp"
        android:layout_height="45dp"       
        android:background="@drawable/image_button_down_final"/>
</LinearLayout>
<LinearLayout
    android:id="@+id/date_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="0.5dp"
    android:layout_marginTop="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginBottom="5dp"
    android:gravity="center"
    android:orientation="vertical">
    <Button
        android:id="@+id/date_plus"
        android:layout_width="45dp"
        android:layout_height="45dp"       
        android:background="@drawable/image_button_up_final"/>
    <EditText
        android:id="@+id/date_display"
        android:layout_width="45dp"
        android:layout_height="35dp"
        android:background="@drawable/picker_middle"
        android:gravity="center"
        android:focusable="false"
        android:inputType="number"
        android:textColor="#000000"
        android:singleLine="true"/>
    <Button
        android:id="@+id/date_minus"
        android:layout_width="45dp"
        android:layout_height="45dp"      
        android:background="@drawable/image_button_down_final"/>
</LinearLayout>
<LinearLayout
    android:id="@+id/year_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="0.5dp"
    android:layout_marginTop="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginBottom="5dp"
    android:gravity="center"
    android:orientation="vertical">
    <Button
        android:id="@+id/year_plus"
        android:layout_width="45dp"
        android:layout_height="45dp"       
            android:background="@drawable/image_button_up_final"/>
    <EditText
        android:id="@+id/year_display"
        android:layout_width="45dp"
        android:layout_height="35dp"
        android:background="@drawable/picker_middle"
        android:gravity="center"
        android:focusable="false"
        android:inputType="number"
        android:textColor="#000000"
        android:singleLine="true"/>
    <Button
        android:id="@+id/year_minus"
        android:layout_width="45dp"
        android:layout_height="45dp"       
        android:background="@drawable/image_button_down_final"/>
</LinearLayout>
<LinearLayout
        android:id="@+id/hour_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:gravity="center"
        android:orientation="vertical">
        <Button
            android:id="@+id/hour_plus"
            android:layout_width="45dp"
            android:layout_height="45dp"          
            android:background="@drawable/image_button_up_final"/>
        <EditText
            android:id="@+id/hour_display"
            android:layout_width="45dp"
            android:layout_height="35dp"
            android:background="@drawable/picker_middle"
            android:gravity="center"
            android:focusable="false"
            android:inputType="number"
            android:textColor="#000000"
            android:singleLine="true">
        </EditText>
        <Button
            android:id="@+id/hour_minus"
            android:layout_width="45dp"
            android:layout_height="45dp"       
            android:background="@drawable/image_button_down_final"/>
    </LinearLayout>
    <LinearLayout
        android:id="@+id/min_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="0.35dp"
        android:layout_marginTop="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginBottom="5dp"
        android:gravity="center"
        android:orientation="vertical">
        <Button
            android:id="@+id/min_plus"
            android:layout_width="45dp"
            android:layout_height="45dp"       
            android:background="@drawable/image_button_up_final"/>
        <EditText
            android:id="@+id/min_display"
            android:layout_width="45dp"
            android:layout_height="35dp"
            android:background="@drawable/picker_middle"
            android:gravity="center"
            android:focusable="false"
            android:inputType="number"
            android:textColor="#000000"
            android:singleLine="true"/>
        <Button
            android:id="@+id/min_minus"
            android:layout_width="45dp"
            android:layout_height="45dp"       
            android:background="@drawable/image_button_down_final"/>
    </LinearLayout>

    <LinearLayout 
        android:id="@+id/meridiem_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="0.35dp"
        android:layout_marginTop="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginBottom="5dp"
        android:gravity="center"
        android:orientation="vertical">
        <ToggleButton 
            android:id="@+id/toggle_display"
            style="@style/SpecialToggleButton"
            android:layout_width="40dp"
            android:layout_height="32dp"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="45dp"
            android:layout_marginRight="5dp"
            android:layout_marginBottom="5dp"
            android:padding="5dp"
            android:gravity="center"
            android:textOn="@string/meridiem_AM"
            android:textOff="@string/meridiem_PM"
            android:checked="true"/>

           <!--  android:checked="true" --> 

    </LinearLayout>
</LinearLayout>
</RelativeLayout>

La MainActivityclase guardada como MainActivity.java :

public class MainActivity extends Activity {
    EditText editText;
    Button button_click;
    public static Activity me = null;
    String meridiem;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText)findViewById(R.id.edittext1);
        button_click = (Button)findViewById(R.id.button1);
        button_click.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view){
                final Dialog mDateTimeDialog = new Dialog(MainActivity.this);
                final RelativeLayout mDateTimeDialogView = (RelativeLayout)   getLayoutInflater().inflate(R.layout.date_time_dialog, null);
                final DateTimePicker mDateTimePicker = (DateTimePicker) mDateTimeDialogView.findViewById(R.id.DateTimePicker);
                // mDateTimePicker.setDateChangedListener();
                ((Button) mDateTimeDialogView.findViewById(R.id.SetDateTime)).setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        mDateTimePicker.clearFocus();
                        int hour = mDateTimePicker.getHour();
                        String result_string = mDateTimePicker.getMonth() +" "+   String.valueOf(mDateTimePicker.getDay()) + ", " + String.valueOf(mDateTimePicker.getYear())
                        + "  " +(mDateTimePicker.getHour()<=9? String.valueOf("0"+mDateTimePicker.getHour()) : String.valueOf(mDateTimePicker.getHour())) + ":" + (mDateTimePicker.getMinute()<=9?String.valueOf("0"+mDateTimePicker.getMinute()):String.valueOf(mDateTimePicker.getMinute()))+" "+mDateTimePicker.getMeridiem();
                        editText.setText(result_string);
                        mDateTimeDialog.dismiss();
                    }
                });
                // Cancel the dialog when the "Cancel" button is clicked
                ((Button) mDateTimeDialogView.findViewById(R.id.CancelDialog)).setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        mDateTimeDialog.cancel();
                    }
                });
                // Reset Date and Time pickers when the "Reset" button is clicked
                ((Button) mDateTimeDialogView.findViewById(R.id.ResetDateTime)).setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        mDateTimePicker.reset();
                    }
                });

                // Setup TimePicker
                // No title on the dialog window
                mDateTimeDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                // Set the dialog content view
                mDateTimeDialog.setContentView(mDateTimeDialogView);
                // Display the dialog
                mDateTimeDialog.show();
            }
        });
    }
}

6

¿Qué hace el inflador?

Toma un diseño xml como entrada (digamos) y lo convierte en objeto Ver.

¿Por qué es necesario?

Pensemos en un escenario en el que necesitamos crear una vista de lista personalizada. Ahora cada fila debe ser personalizada. Pero, ¿cómo podemos hacerlo? No es posible asignar un diseño xml a una fila de vista de lista. Entonces, creamos un objeto Ver. Por lo tanto, podemos acceder a los elementos que contiene (vista de texto, vista de imagen, etc.) y también asignar el objeto como fila de vista de lista

Entonces, cada vez que necesitemos asignar un objeto de tipo de vista en algún lugar y tengamos nuestro diseño xml personalizado, simplemente lo convertiremos en objeto mediante inflador y lo usaremos.


Entonces, señor Zahan, ¿es como el DOM en Javascript? • o •
Jeancarlo Fontalvo

6

LayoutInflater es una clase utilizada para instanciar archivos XML de diseño en sus objetos de vista correspondientes que se pueden usar en programas Java. En términos simples, hay dos formas de crear una interfaz de usuario en Android. Una es una forma estática y otra es dinámica o programática. Supongamos que tenemos un diseño simple main.xml que tiene uno textviewy uno de la edittextsiguiente manera.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/layout1"
    >
<TextView
        android:id="@+id/namelabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Enter your name"
        android:textAppearance="?android:attr/textAppearanceLarge" >
    </TextView>
    <EditText
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginTop="14dp"
        android:ems="10">
    </EditText>
</LinearLayout>

Podemos mostrar este diseño de forma estática mediante

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

Una forma dinámica de crear una vista significa que la vista no se menciona en nuestro main.xml pero queremos mostrarla en tiempo de ejecución. Por ejemplo, tenemos otro XML en la carpeta de diseño como footer.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/TextView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:text="Add your record"
    android:textSize="24sp" >
 </TextView>

Queremos mostrar este cuadro de texto en tiempo de ejecución dentro de nuestra interfaz de usuario principal. Entonces aquí inflaremos text.xml. Ver cómo:

public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  final LayoutInflater  inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  TextView t = (TextView)inflater.inflate(R.layout.footer,null);

  lLayout = (LinearLayout)findViewById(R.id.layout1);
  lLayout.addView(t);

Aquí he usado getSystemService (String) para recuperar una instancia de LayoutInflater. También puedo usar getLayoutInflator () para inflar en lugar de usar getSystemService (String) como se muestra a continuación:

LayoutInflator inflater = getLayoutInflater();
TextView t = (TextView) inflater.inflate(R.layout.footer, null);
lLayout.addView(t);

5

Aquí hay un ejemplo para obtener una referencia para la Vista raíz de un diseño, inflarlo y usarlo con setContentView (Vista de vista)

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LayoutInflater li=getLayoutInflater();
    View rootView=li.inflate(R.layout.activity_main,null);
    setContentView(rootView);


}

1

Layout Inflater es una clase que lee la descripción del aspecto xml y los convierte en objetos View basados ​​en Java.


0

mi lista de personalización espero que ilustre el concepto

public class second extends ListActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second);
//  TextView textview=(TextView)findViewById(R.id.textView1);
//  textview.setText(getIntent().getExtras().getString("value"));

    setListAdapter(new MyAdapter(this,R.layout.list_item,R.id.textView1, getResources().getStringArray(R.array.counteries)));
}

private class MyAdapter extends ArrayAdapter<String>{

    public MyAdapter(Context context, int resource, int textViewResourceId,
            String[] objects) {
        super(context, resource, textViewResourceId, objects);
        // TODO Auto-generated constructor stub
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row=inflater.inflate(R.layout.list_item,parent,false);
        String[]items=getResources().getStringArray(R.array.counteries);

        ImageView iv=(ImageView) row.findViewById(R.id.imageView1);
        TextView tv=(TextView) row.findViewById(R.id.textView1);
        tv.setText(items[position]);

        if(items[position].equals("unitedstates")){
            iv.setImageResource(R.drawable.usa);
        }else   if(items[position].equals("Russia")){
            iv.setImageResource(R.drawable.russia);
        }else   if(items[position].equals("Japan")){
            iv.setImageResource(R.drawable.japan);
        }
        // TODO Auto-generated method stub
        return row;
    }

}

}

0

LayoutInflater es un componente fundamental en Android. Debe usarlo todo el tiempo para convertir los archivos xml en jerarquías de vista.


0

LayoutInflater crea objetos de vista basados ​​en diseños definidos en XML. Hay varias formas diferentes de usar LayoutInflater, incluida la creación de vistas personalizadas, inflar vistas de fragmentos en vistas de actividad, crear cuadros de diálogo o simplemente inflar una vista de archivo de diseño en una actividad.

Hay muchos conceptos erróneos sobre cómo funciona el proceso de inflación. Creo que esto proviene de la falta de documentación para el método inflate (). Si desea obtener información detallada sobre el método inflate (), escribí una publicación de blog al respecto aquí:

https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/


0

Inflater en realidad algún tipo de conversión a datos, vistas, instancias, a la representación de la interfaz de usuario visible .. ..que utiliza el suministro de datos desde quizás adaptadores, etc. mediante programación. luego integrándolo con un xml que definió, que le dice cómo se deben representar los datos en la interfaz de usuario

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.