vistas studio layoutinflater layout_inflater_service inflar getlayoutinflater example como android layout-inflater android-inflate

android - studio - layout_inflater_service



¿Qué hace LayoutInflater en Android? (14)

¿Cuál es el uso de LayoutInflater en Android?


¿Qué hace LayoutInflator ?

Cuando comencé la programación de Android, LayoutInflater y findViewById me confundieron. A veces usamos una y otras la otra.

  • LayoutInflater se utiliza para crear un nuevo objeto de View (o Layout ) a partir de uno de sus diseños xml.
  • findViewById solo le proporciona una referencia a una vista que ya se ha creado. Podría pensar que todavía no ha creado ninguna vista, pero cada vez que llama a setContentView en onCreate , el diseño de la actividad junto con sus subvistas se infla (crea) detrás de la escena.

Entonces, si la vista ya existe, use findViewById . Si no, LayoutInflater con un LayoutInflater .

Ejemplo

Aquí hay un mini proyecto que hice que muestra tanto LayoutInflater como findViewById en acción. Sin un código especial, el diseño se ve así.

El cuadrado azul es un diseño personalizado insertado en el diseño principal con include (consulte here para obtener más información). Se infla automáticamente porque es parte de la vista de contenido. Como puedes ver, no hay nada especial en el código.

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

Ahora vamos a inflar (crear) otra copia de nuestro diseño personalizado y agregarla.

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

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

Aquí está de nuevo 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 se utiliza findViewById solo después de que ya se haya inflado un diseño.

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 necesitas LayoutInflater?

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

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

Supongamos que el diseño de fila de ListView puede tener un número variable de vistas de texto. Así que primero infla la vista del elemento base (como en el ejemplo anterior), y luego agrega un bucle dinámicamente agregando TextViews en tiempo de ejecución. Usando android: layout_weight además 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 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; }

Tenga en cuenta 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


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

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


Cuando utiliza una vista personalizada en un ListView , debe definir el diseño de la fila. Usted crea un xml donde coloca los widgets de Android y luego, en el código del adaptador, tiene 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 .


Esta clase se utiliza para crear una instancia del archivo XML de diseño en sus objetos de View correspondientes. Nunca se debe usar directamente: use getLayoutInflater() o getSystemService(String) 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. Por ejemplo:

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

Referencia: LayoutInflater


Inflar significa leer el archivo XML que describe un diseño (o elemento GUI) y crear los objetos reales que corresponden a él, 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 clase MainActivity 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(); } }); } }


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


Layout inflater es una clase que lee la descripción de apariencia xml y la convierte en objetos de vista basados ​​en java.


LayoutInflater crea objetos de vista basados ​​en diseños definidos en XML. Hay varias formas diferentes de usar LayoutInflater, como crear vistas personalizadas, inflar vistas de fragmentos en vistas de actividad, crear diálogos o simplemente inflar una vista de archivo de diseño en una actividad.

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

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


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


LayoutInflater.inflate () proporciona un medio para convertir un archivo res / layout / * .xml que define una vista en un objeto de Vista real utilizable 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 asumiendo que el archivo xml es "list_item.xml"?

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


mi lista de personalización espero ilustrar 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; } } }


LayoutInflater clase LayoutInflater se utiliza para crear una instancia del archivo XML de diseño en sus objetos de vista correspondientes.

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


Lo que hace inflater

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

Por que se necesita

Pensemos en un escenario donde 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 la vista de lista. Por lo tanto, creamos un objeto de vista. De este modo, 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

Por lo tanto, siempre que tengamos que asignar un objeto de tipo de vista en algún lugar y tengamos nuestro diseño XML personalizado, simplemente lo convertimos en objeto por inflador y lo usamos.