Cosa fa LayoutInflater in Android?


Risposte:


164

Quando si utilizza una vista personalizzata in a, ListViewè necessario definire il layout della riga. Si crea un xml in cui si posizionano widget Android e quindi nel codice dell'adattatore è necessario fare qualcosa del genere:

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

Maggiori informazioni nella documentazione ufficiale .


23
Idealmente dovresti prima provare convertView per vedere se riesci a riciclare una risorsa, quindiView view = convertView; if (view == null) { view = mInflater.... }
Jannie Theunissen,

13
Non penso che questa risposta spieghi davvero cosa LayoutInflatersia, sebbene spieghi dove usarla. La risposta 1-down è migliore.
James Ko,

5
Questo non spiega cosa sia un LayoutInflater. Spiega come usarlo.
Donato,

2
Sto cercando la spiegazione di LayoutInflater.
Giocatore

@ Player1 Puoi controllare questo post
Bertram Gilfoyle l'

284

La classe LayoutInflater viene utilizzata per creare un'istanza del contenuto dei file XML di layout nei corrispondenti oggetti View.

In altre parole, accetta un file XML come input e crea gli oggetti View da esso.


74
Quello che stavo cercando è la parte "in altre parole" poiché la parte superiore è già nei documenti API
Nipuna

1
Questo mi sembra ancora piuttosto astratto. Quindi, diciamo che ho un single_list_item.xmlfile per ogni riga di a ListView. L'uso di quel file XML è un po 'come un gonfiatore?
JohnK,

169

Cosa fa LayoutInflator?

Quando ho iniziato a programmare Android, ero davvero confuso da LayoutInflatere findViewById. A volte ne abbiamo usato uno, a volte l'altro.

  • LayoutInflaterè usato per creare un nuovo View(o Layout) oggetto da uno dei tuoi layout xml.
  • findViewByIdti dà solo un riferimento a una vista che è già stata creata. Si potrebbe pensare che non hai ancora creato alcuna vista, ma ogni volta che si chiama setContentViewin onCreate, il layout della propria attività insieme con i suoi subviews ottiene gonfiato (creato) dietro le quinte.

Quindi, se la vista esiste già, quindi utilizzare findViewById. In caso contrario, crearlo con a LayoutInflater.

Esempio

Ecco un mini progetto ho realizzato che mostra sia LayoutInflatere findViewByIdin azione. Senza un codice speciale, il layout è simile al seguente.

inserisci qui la descrizione dell'immagine

Il quadrato blu è un layout personalizzato inserito nel layout principale con include(vedi qui per ulteriori informazioni). È stato gonfiato automaticamente perché fa parte della visualizzazione del contenuto. Come puoi vedere, non c'è nulla di speciale nel codice.

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

Ora gonfiamo (creiamo) un'altra copia del nostro layout personalizzato e aggiungiamola.

inserisci qui la descrizione dell'immagine

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

Per gonfiare il nuovo layout della vista, tutto ciò che ho fatto è stato dire al gonfiatore il nome del mio file xml ( my_layout), il layout principale a cui voglio aggiungerlo ( mainLayout) e che in realtà non voglio ancora aggiungerlo ( false) . (Potrei anche impostare il genitore su null, ma i parametri di layout della vista radice del mio layout personalizzato verrebbero ignorati.)

Eccolo di nuovo nel contesto.

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

Notare come findViewByIdviene utilizzato solo dopo che un layout è già stato gonfiato.

Codice Supplementare

Ecco il file XML per l'esempio sopra.

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 hai bisogno di LayoutInflater

  • Il momento più comune in cui la maggior parte delle persone lo usa è in a RecyclerView. (Vedi questi RecyclerViewesempi per un elenco o una griglia .) Devi gonfiare un nuovo layout per ogni singolo elemento visibile nell'elenco o nella griglia.
  • Puoi anche usare un gonfiatore di layout se hai un layout complesso che desideri aggiungere a livello di programmazione (come abbiamo fatto nel nostro esempio). Potresti fare tutto nel codice, ma è molto più semplice definirlo prima in xml e poi semplicemente gonfiarlo.

22
Una spiegazione molto, molto migliore della risposta indicata come soluzione. A volte la vita non è giusta.
Steve Wellens,

Salve signore, se ho più di una vista in main_activity.xml, come posso impostare la vista external.xml in main_activity con center layout_gravity.
Principe

1
Questa dovrebbe essere la risposta accettata. Così facile da capire per tutti i principianti.
Mr Cold,

Mylayout è un tipo di visualizzazione o tipo LinearLayout?
HS Singh,

@HSSingh, myLayoutè una vista, anche se avrei potuto gonfiarlo come RelativeLayout (vedi my_layout.xml). Dopo che è gonfiato, lo aggiungo come sottoview del genitore LinearLayout (ovvero, mainLayout).
Suragch,

31

LayoutInflater.inflate () fornisce un mezzo per convertire un file res / layout / * .xml che definisce una vista in un oggetto Vista effettivo utilizzabile nel codice sorgente dell'applicazione.

due passaggi di base: ottenere il gonfiatore e quindi gonfiare la risorsa

Come si ottiene il gonfiatore?

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

Come si ottiene la vista assumendo che il file xml sia "list_item.xml"?

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

22

Ecco un altro esempio simile al precedente, ma esteso per dimostrare ulteriormente i parametri di gonfiaggio e il comportamento dinamico che può fornire.

Supponiamo che il layout di riga di ListView possa avere un numero variabile di visualizzazioni di testo. Quindi, prima gonfia la vista di base (proprio come nell'esempio precedente), quindi aggiungi ciclicamente TextViews in fase di esecuzione. Usando Android: layout_weight allinea inoltre perfettamente tutto.

Ecco le risorse per i layout:

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

Sostituisci metodo getView in estensione della 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;
}

Nota diverse chiamate al metodo infllate:

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

Questa classe viene utilizzata per creare un'istanza del file XML di layout nei suoi Viewoggetti corrispondenti . Non può mai essere utilizzato direttamente: utilizzare getLayoutInflater()o getSystemService(String)per recuperare LayoutInflaterun'istanza standard che è già collegata al contesto corrente e configurata correttamente per il dispositivo su cui si sta eseguendo. Per esempio:

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

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


2
Questo può essere vero ma non risponde alla domanda.
Sinthia V,

8

Gonfiare significa leggere il file XML che descrive un layout (o elemento GUI) e creare gli oggetti reali che corrispondono ad esso, e quindi rendere visibile l'oggetto all'interno di un'app 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);

Questo file potrebbe essere salvato come 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>

Questo file potrebbe essere salvato come 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 MainActivityclasse salvata come 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

Cosa fa il gonfiatore

Prende un layout XML come input (diciamo) e lo converte in Visualizza oggetto.

Perché necessario

Pensiamo a uno scenario in cui è necessario creare una visualizzazione elenco personalizzata. Ora ogni riga dovrebbe essere personalizzata. Ma come possiamo farlo. Non è possibile assegnare un layout XML a una riga di visualizzazione elenco. Quindi, creiamo un oggetto View. In questo modo possiamo accedere agli elementi in esso contenuti (visualizzazione di testo, visualizzazione di immagini, ecc.) E anche assegnare l'oggetto come riga della visualizzazione elenco

Quindi, ogni volta che abbiamo bisogno di assegnare un oggetto tipo di vista da qualche parte e abbiamo il nostro design XML personalizzato, lo convertiamo semplicemente in oggetto per gonfiatore e lo usiamo.


Quindi, signor Zahan, è come il DOM in Javascript? • o •
Jeancarlo Fontalvo il

6

LayoutInflater è una classe utilizzata per creare un'istanza del file XML di layout nei corrispondenti oggetti vista che possono essere utilizzati nei programmi Java. In termini semplici, ci sono due modi per creare l'interfaccia utente in Android. Uno è un modo statico e un altro è dinamico o programmaticamente. Supponiamo di avere un semplice layout main.xml con uno textviewe uno edittextcome segue.

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

Possiamo visualizzare questo layout in modo statico da

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

Un modo dinamico di creare una vista significa che la vista non è menzionata nel nostro main.xml ma vogliamo mostrarla in fase di esecuzione. Ad esempio, abbiamo un altro XML nella cartella layout come 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>

Vogliamo mostrare questa casella di testo in fase di esecuzione all'interno della nostra interfaccia utente principale. Quindi qui gonferemo text.xml. Vedi come:

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

Qui ho usato getSystemService (String) per recuperare un'istanza LayoutInflater. Posso usare anche getLayoutInflator () per gonfiare invece di usare getSystemService (String) come di seguito:

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

5

ecco un esempio per ottenere un riferimento per la vista radice di un layout, gonfiarlo e 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);


}

1

Il gonfiatore del layout è una classe che legge la descrizione dell'aspetto xml e li converte in oggetti View basati su Java.


0

la mia lista personalizzata spero che illustri il concetto

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 è un componente fondamentale in Android. È necessario utilizzarlo continuamente per trasformare i file XML in gerarchie di visualizzazione.


0

LayoutInflater crea oggetti View in base a layout definiti in XML. Esistono diversi modi per utilizzare LayoutInflater, tra cui la creazione di viste personalizzate, il gonfiaggio di viste di frammenti in viste di attività, la creazione di finestre di dialogo o il semplice gonfiamento di una vista di file di layout in un'attività.

Ci sono molte idee sbagliate su come funziona il processo di inflazione. Penso che questo provenga da una scarsa documentazione per il metodo inflate (). Se vuoi conoscere il metodo inflate () in dettaglio, ho scritto un post sul blog qui:

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


0

In realtà gonfia una sorta di conversione in dati, viste, istanze, in una rappresentazione visibile dell'interfaccia utente ... ..usando quindi utilizza il feed di dati da forse adattatori, ecc. A livello di programmazione. quindi integrandolo con un XML definito dall'utente, che indica come i dati dovrebbero essere rappresentati nell'interfaccia utente

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.