O que o LayoutInflater no Android faz?

Respostas:

164

Quando você usa uma visualização personalizada em um, ListViewdeve definir o layout da linha. Você cria um xml no qual coloca widgets do Android e, no código do adaptador, precisa fazer algo assim:

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;
}

Leia mais na documentação oficial .

Macarse
fonte
23
Idealmente, você deve primeiro teste convertView para ver se você pode reciclar um recurso, entãoView view = convertView; if (view == null) { view = mInflater.... }
Jannie Theunissen
13
Não acho que essa resposta realmente explique o que LayoutInflateré, embora explique onde usá-la. A resposta 1-down é melhor.
James Ko
5
Isso não explica o que é um LayoutInflater. Explica como usá-lo.
Donato
2
Estou procurando a explicação do LayoutInflater.
precisa saber é o seguinte
@ Player1 Você pode conferir este post
Bertram Gilfoyle
284

A classe LayoutInflater é usada para instanciar o conteúdo dos arquivos XML de layout em seus objetos View correspondentes.

Em outras palavras, ele pega um arquivo XML como entrada e cria os objetos View a partir dele.

Pentium10
fonte
74
O que eu estava procurando é a parte "em outras palavras," uma vez que a parte de cima já está nas docs API
Nipuna
1
Isso ainda parece bastante abstrato para mim. Então, digamos que eu tenho um single_list_item.xmlarquivo para cada linha de a ListView. O uso desse arquivo XML é como um inflador?
JohnK
169

O que LayoutInflatorfaz?

Quando iniciei a programação do Android, fiquei realmente confuso com LayoutInflatere findViewById. Algumas vezes usamos um e outras vezes.

  • LayoutInflateré usado para criar um novo objeto View(ou Layout) a partir de um de seus layouts xml.
  • findViewByIdapenas fornece uma referência a uma exibição que já foi criada. Você pode pensar que você não criou nenhuma view ainda, mas sempre que você chamar setContentViewem onCreate, layout da atividade junto com seus subviews fica inflado (criado) nos bastidores.

Portanto, se a visualização já existir, use findViewById. Caso contrário, crie-o com a LayoutInflater.

Exemplo

Aqui está um mini projeto que eu fiz, exibindo LayoutInflatere findViewByIdem ação. Sem código especial, o layout fica assim.

insira a descrição da imagem aqui

O quadrado azul é um layout personalizado inserido no layout principal com include(veja aqui para mais informações). Foi inflado automaticamente porque faz parte da exibição do conteúdo. Como você pode ver, não há nada de especial no código.

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

Agora vamos inflar (criar) outra cópia do nosso layout personalizado e adicioná-lo.

insira a descrição da imagem aqui

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

Para inflar o novo layout de exibição, tudo o que fiz foi dizer ao inflator o nome do meu arquivo xml ( my_layout), o layout pai ao qual desejo adicioná-lo ( mainLayout) e que na verdade não quero adicioná-lo ainda ( false) . (Eu também poderia definir o pai como null, mas os parâmetros de layout da visualização raiz do meu layout personalizado seriam ignorados.)

Aqui está novamente em 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 como findViewByIdé usado somente depois que um layout já foi inflado.

Código Suplementar

Aqui está o xml para o exemplo acima.

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>

Quando você precisa do LayoutInflater

  • O tempo mais comum usado pela maioria das pessoas é em a RecyclerView. (Veja esses RecyclerViewexemplos para obter uma lista ou uma grade .) É necessário aumentar um novo layout para cada item visível na lista ou grade.
  • Você também pode usar um inflator de layout se tiver um layout complexo que deseja adicionar programaticamente (como fizemos no nosso exemplo). Você pode fazer tudo isso no código, mas é muito mais fácil defini-lo no xml primeiro e depois apenas inflá-lo.
Suragch
fonte
22
Uma explicação muito, muito melhor do que a resposta marcada como a solução. Às vezes a vida não é justa.
Steve Wellens
Olá senhor, se eu tiver mais de uma visualização em main_activity.xml, como posso definir a visualização external.xml em main_activity com o layout_gravity central.
Prince
1
Essa deve ser a resposta aceita. Tão fácil de entender para qualquer iniciante.
Sr. Cold
Mylayout é um tipo de exibição ou um tipo de LinearLayout?
HS Singh
@HSSingh, myLayouté uma View, embora eu possa tê-la inflado como um RelativeLayout (consulte my_layout.xml). Depois de inflado, eu o adiciono como uma subvisão do pai LinearLayout (ou seja, mainLayout).
Suragch 7/10/19
31

LayoutInflater.inflate () fornece um meio de converter um arquivo res / layout / *. Xml que define uma exibição em um objeto de exibição real, utilizável no código-fonte do aplicativo.

dois passos básicos: obter o inflador e depois inflar o recurso

Como você consegue o inflador?

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

Como você obtém a visualização assumindo que o arquivo xml é "list_item.xml"?

View view = inflater.inflate(R.layout.list_item, parent, false);
Scott Hellam
fonte
22

Aqui está outro exemplo semelhante ao anterior, mas estendido para demonstrar ainda mais os parâmetros e o comportamento dinâmico que ele pode fornecer.

Suponha que seu layout de linha do ListView possa ter um número variável de TextViews. Primeiro, você aumenta o modo de exibição do item base (como no exemplo anterior) e depois faz um loop adicionando dinamicamente TextViews em tempo de execução. Usando o android: layout_weight também alinha tudo perfeitamente.

Aqui estão os recursos do Layouts:

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"/>

Substituir o método getView na extensão da classe 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 chamadas do método inflar:

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

Essa classe é usada para instanciar o arquivo XML de layout em seus Viewobjetos correspondentes . Ele nunca é usado diretamente - use getLayoutInflater()ou getSystemService(String)para recuperar uma LayoutInflaterinstância padrão que já esteja conectada ao contexto atual e configurada corretamente para o dispositivo em que você está executando. Por exemplo:

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

Referência: http://developer.android.com/reference/android/view/LayoutInflater.html

Abhishek Singh Rathaur
fonte
2
Isso pode ser verdade, mas não responde à pergunta.
Sinthia V
8

Inflar significa ler o arquivo XML que descreve um layout (ou elemento da GUI) e criar os objetos reais que correspondem a ele e, assim, tornar o objeto visível em um aplicativo 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 arquivo pode ser salvo 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 arquivo pode ser salvo 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>

A MainActivityclasse salva 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();
            }
        });
    }
}
Jijo
fonte
6

O inflator faz

Ele pega um layout xml como entrada (digamos) e o converte no objeto View.

Por que é necessário

Vamos pensar em um cenário em que precisamos criar uma exibição de lista personalizada. Agora cada linha deve ser personalizada. Mas como podemos fazer isso. Não é possível atribuir um layout xml a uma linha de listview. Então, criamos um objeto View. Assim, podemos acessar os elementos nele (textview, imageview etc) e também atribuir o objeto como linha de listview

Portanto, sempre que precisarmos atribuir um objeto de tipo de exibição em algum lugar e tivermos nosso design xml personalizado, apenas o converteremos em objeto inflando-o e usá-lo.

Zahan Safallwa
fonte
Então, senhor Zahan, é como o DOM em Javascript? • o •
Jeancarlo Fontalvo
6

LayoutInflater é uma classe usada para instanciar o arquivo XML de layout em seus objetos de exibição correspondentes que podem ser usados ​​em programas Java. Em termos simples, existem duas maneiras de criar UI no Android. Um é uma maneira estática e o outro é dinâmico ou programaticamente. Suponha que tenhamos um layout simples main.xml com um textviewe um da edittextseguinte maneira.

<?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 exibir esse layout de maneira estática,

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

Uma maneira dinâmica de criar uma visualização significa que a visualização não é mencionada em nosso main.xml, mas queremos mostrar isso em tempo de execução. Por exemplo, temos outro XML na pasta de layout 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 essa caixa de texto em tempo de execução na nossa interface principal. Então, aqui vamos inflar o text.xml. Veja como:

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);

Aqui, usei getSystemService (String) para recuperar uma instância de LayoutInflater. Também posso usar getLayoutInflator () para aumentar, em vez de usar getSystemService (String) como abaixo:

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

Aqui está um exemplo para obter uma referência para a visualização raiz de um layout, inflá-lo e usá-lo com setContentView (visualização de exibição)

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


}
Gal Rom
fonte
1

O inflator de layout é uma classe que lê a descrição da aparência xml e as converte em objetos View baseados em java.

Muhammed Shibin
fonte
0

minha lista de personalização espero ilustrar o conceito

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;
    }

}

}
Moustafa Bayommy
fonte
0

LayoutInflater é um componente fundamental no Android. Você deve usá-lo o tempo todo para transformar arquivos xml em hierarquias de exibição.

vishwas
fonte
0

LayoutInflater cria objetos View com base em layouts definidos em XML. Existem várias maneiras diferentes de usar o LayoutInflater, incluindo a criação de vistas personalizadas, inflando vistas de fragmento para vistas de atividade, criando caixas de diálogo ou simplesmente inflando um arquivo de layout para uma atividade.

Existem muitos conceitos errados sobre como o processo de inflação funciona. Eu acho que isso vem da falta de documentação para o método inflate (). Se você quiser aprender sobre o método inflate () em detalhes, escrevi um post sobre isso aqui:

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

seanjfarrell
fonte
0

Inflate, na verdade, algum tipo de conversão para dados, visualizações, instâncias, para representação visível da interface do usuário. em seguida, integrando-o com um xml que você definiu, que informa como os dados devem ser representados na interface do usuário


fonte