Che cosa significa gonfiare una vista da un file XML?


278

Sono nuovo nello sviluppo di Android e continuo a trovare riferimenti a Inflating views da un file xml di layout. Ho cercato su Google e cercato la guida allo sviluppo, ma non riuscivo ancora a capire cosa significasse. Se qualcuno potesse fornire un esempio molto semplice, sarebbe molto apprezzato.

Risposte:


257

Quando si scrive un layout XML, verrà gonfiato dal sistema operativo Android, il che significa sostanzialmente che verrà reso creando l'oggetto vista in memoria. Chiamiamo quell'inflazione implicita (il sistema operativo gonferà la vista per te). Per esempio:

class Name extends Activity{
    public void onCreate(){
         // the OS will inflate the your_layout.xml
         // file and use it for this activity
         setContentView(R.layout.your_layout);
    }
}

Puoi anche gonfiare le viste esplicitamente usando il LayoutInflater. In tal caso devi:

  1. Ottieni un'istanza di LayoutInflater
  2. Specifica l'XML da gonfiare
  3. Usa il reso View
  4. Imposta la vista del contenuto con la vista restituita (sopra)

Per esempio:

LayoutInflater inflater = LayoutInflater.from(YourActivity.this); // 1
View theInflatedView = inflater.inflate(R.layout.your_layout, null); // 2 and 3
setContentView(theInflatedView) // 4

24
se inflate = rendering, a che serve esattamente onDraw ()?
PypeBros,

@sylvainulg, R.id.view viene utilizzato per modificare gli attributi dell'elemento xml e infllate può fare lo stesso. il gonfiaggio è particolarmente utile nelle viste personalizzate. Per gonfiare l'intero file XML, viene utilizzata la familiare setContentView of Activity class. Una vista deve gonfiare ogni vista manualmente utilizzando LayoutInflater object.inflate (). Un'attività ha un ciclo di vita. Una vista ha invece un ciclo di disegno. inflater è particolarmente utile con la visualizzazione personalizzata anziché utilizzare il layout predifiend nel file XML.
Sree Rama,

@Cristian Per favore, pensi di potermi dare qualche consiglio / idea qui goo.gl/E37NSu
eddy

24
Non penso che il gonfiamento sia il rendering piuttosto che il gonfiamento è la creazione effettiva dell'oggetto View in memoria basato sul contenuto del file xml. Dopo il gonfiaggio, la vista sarà in memoria non necessariamente visibile.
Ahmed l'

1
@MattJ. Bene, la mia risposta potrebbe essere mal formulata. Android gonfia la vista non solo avendo l'XML da qualche parte, ma quando chiami setContentView o gonfia manualmente il layout. Quando chiami findViewByIdgli oggetti vista sono già in memoria e l'unica ragione per farlo è ottenere un riferimento a quel particolare oggetto (o per cambiarlo o ricavarne dei dati).
Cristian,

160

"Gonfiare" una vista significa prendere il layout XML e analizzarlo per creare la vista e gli oggetti viewgroup dagli elementi e dai loro attributi specificati all'interno, quindi aggiungere la gerarchia di tali viste e viewgroup al ViewGroup padre. Quando si chiama setContentView (), allega le viste che crea dalla lettura dell'XML all'attività. Puoi anche utilizzare LayoutInflater per aggiungere visualizzazioni a un altro ViewGroup, che può essere uno strumento utile in molte circostanze.


22
mi sembra una descrizione molto più accurata.
PypeBros,

4
Sono ancora un po 'confuso dalla terminologia "inflazione". (Se solo potessi smettere di immaginare l'aria che entra in qualcosa). Ma forse questo aiuterà: ho appena eseguito il programma di decompressione in un terminale Ubuntu e ho notato la terminologia: "inflating: X / Y / z.xml". Suppongo sia davvero lo stesso concetto.
Ben Ogorek,

6
"Gonfiare" in questo caso significa che il framework sta prendendo la descrizione del layout dall'XML e popola la gerarchia della vista con oggetti View reali. Quindi, si sta gonfiando nel senso di compilare il layout.
jjb

1
@FranciscoCorrales - Sicuro. La cosa più comune per cui useresti questo genere di cose è per qualcosa come un ListAdapter , dove vuoi popolare una riga. L'ho usato per popolare cose come LinearLayouts, ripetendo alcuni oggetti dati in un modo che non suggeriva l'approccio ListAdapter.
jjb

36

Il gonfiamento è il processo di aggiunta di una vista (.xml) all'attività in fase di esecuzione. Quando creiamo un elenco Visualizza, gonfiamo dinamicamente ciascuno dei suoi elementi. Se vogliamo creare un ViewGroup con più viste come pulsanti e visualizzazione di testo, possiamo crearlo in questo modo:

Button but = new Button();
but.setText ="button text";
but.background ...
but.leftDrawable.. and so on...

TextView txt = new TextView();
txt.setText ="button text";
txt.background ... and so on...

Quindi dobbiamo creare un layout in cui possiamo aggiungere le viste sopra:

RelativeLayout rel = new RelativeLayout();

rel.addView(but);

E ora se vogliamo aggiungere un pulsante nell'angolo destro e una visualizzazione di testo in basso, dobbiamo fare molto lavoro. Innanzitutto istanziando le proprietà della vista e quindi applicando più vincoli. Questo richiede tempo.

Android ci semplifica la creazione di un semplice .xml e la progettazione del suo stile e dei suoi attributi in xml, per poi semplicemente gonfiarlo ovunque ne abbiamo bisogno senza il dolore di impostare i vincoli a livello di programmazione.

LayoutInflater inflater = 
              (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View menuLayout = inflater.inflate(R.layout.your_menu_layout, mainLayout, true);
//now add menuLayout to wherever you want to add like

(RelativeLayout)findViewById(R.id.relative).addView(menuLayout);

Mi piace come hai descritto cosa sia l'inflazione, mostrando come lo faresti manualmente.
Daniel,

1
Cosa significa il parametro inflate attachToRoot?
flz,


5

Penso che qui "gonfiare una vista" significhi recuperare il file layout.xml disegnando una vista specificata in quel file xml e POPOLANDO (= gonfiando) il gruppo di vista padre con la vista creata.


4

Una definizione da laici per l'inflazione potrebbe essere quella di convertire il codice XML in codice Java. Solo un modo per capire, ad esempio, se abbiamo un tag in XML, il sistema operativo deve creare un corrispondente oggetto Java in memoria, quindi l'infattore legge i tag XML e crea gli oggetti corrispondenti in Java.


2

Poiché realizziamo l'interfaccia utente in XML ma visualizziamo gli oggetti è ciò che visualizziamo, quindi in qualche modo abbiamo bisogno di convertire xml in oggetti view in modo che gonfiare significa che stiamo convertendo xml in oggetti view in modo che possa essere visualizzato, per questo abbiamo bisogno di un servizio chiamato layout inflator service e dagli un XML e verrà convertito per te.

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.