Come gonfiare una vista con un layout


221

Ho un layout definito in XML. Contiene anche:

<RelativeLayout
    android:id="@+id/item"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>

Vorrei gonfiare questo RelativeView con altri file di layout XML. Potrei usare layout diversi a seconda della situazione. Come dovrei farlo? Stavo provando diverse varianti di

RelativeLayout item = (RelativeLayout) findViewById(R.id.item);
item.inflate(...)

Ma nessuno di loro ha funzionato bene.

Risposte:


390

Non sono sicuro di aver seguito la tua domanda: stai cercando di allegare una vista figlio a RelativeLayout? Se è così, vuoi fare qualcosa sulla falsariga di:

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);

3
Ottengo un errore: 02-25 22: 21: 19.324: ERRORE / AndroidRuntime (865): causato da: java.lang.IllegalStateException: il figlio specificato ha già un genitore. Devi prima chiamare removeView () sul genitore del bambino.
Michal Dymel,

27
Ho appena provato questo, avevo bisogno di: Visualizza child = getLayoutInflater (). Inflate (R.layout.child, null);
James,

3
Il problema non è il codice. È abbastanza facile seguire il codice. Dove si crea il file xml. il tipo è una risorsa in stile tema? il problema penso che le persone che ho incluso è dove stiamo posizionando questo file xml
Lpc_dark

15
Questo non è perfetto Dovrebbe essere utilizzata la versione a 3 parametri del gonfiatore - ecco perché: doubleencore.com/2013/05/layout-inflation-as-intended
Nick Cardoso

3
La risposta è errata, anche se funziona. Dai un'occhiata a questo post possibilemobile.com/2013/05/layout-inflation-as-intended
ARK

107

Si gonfia una risorsa XML. Vedi il documento LayoutInflater .

Se il layout è in mylayout.xml , dovresti fare qualcosa del tipo:

View view; 
LayoutInflater inflater = (LayoutInflater)   getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);

RelativeLayout item = (RelativeLayout) view.findViewById(R.id.item);

4
Ho la mia vista principale gonfiata. Il problema è che voglio gonfiarne una parte da un altro file XML. Questo articolo RelativeLayout fa parte di un layout più grande e voglio riempirlo con il layout di un altro file XML.
Michal Dymel,

hum mi dispiace quindi non ho idea :(. Stai usando qualcosa come <include> nella tua vista principale per includere altri layout?
ccheneson

No, è un layout semplice. Penso che aggiungerò i miei elementi in modo programmatico, senza XML. Grazie per l'aiuto!
Michal Dymel,

27

Sebbene rispondere in ritardo, ma vorrei aggiungere un modo per ottenerlo

LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = layoutInflater.inflate(R.layout.mylayout, item );

dove si itemtrova il layout principale in cui si desidera aggiungere un layout secondario.


(anche più tardi) Ho difficoltà a implementare la tua risposta. Ho provato il codice che hai menzionato sopra ma ho sostituito 'item' con: 'R.layout.activity_layout' Ricevo un "Non esiste un metodo applicabile a '(int, int)'" Potrei disturbarti per i tuoi pensieri?
Kyle,

1
@Kyle - ancora più tardi ancora. Non puoi usare le Rrisorse come riferimenti a un oggetto, sono solo ints. Devi usarlo findViewByIdpassando la Rrisorsa, quindi digita cast sull'oggetto desiderato. Quindi puoi usarlo in chiamate di funzione come inflate. (cioè ViewGroup item = (ViewGroup) findViewById(R.layout.activity_layout);... allora puoi usare itemcome sopra.)
Pimp Trizkit il

Immagino di usare RelativeLayoutinvece di ViewGrouplì nel mio esempio sopra, dato che non puoi istanziare la classe base ViewGroup. La regola di modifica di 5 minuti mi ha preso. lol
Pimp Trizkit,

È possibile nascondere un genitore e visualizzare solo la vista figlio
NovusMobile

Grazie, questo metodo ha aiutato dove non potevo usare getContext () nell'esempio precedente poiché sto usando frammenti.
RightHandedMonkey,

19

È utile aggiungere a questo, anche se è un vecchio post, che se la vista figlio che viene gonfiata da XML deve essere aggiunta a un layout di viewgroup, è necessario chiamare gonfiare con un indizio di quale tipo di viewgroup sta andando da aggiungere a. Piace:

View child = getLayoutInflater().inflate(R.layout.child, item, false);

Il metodo infllate è piuttosto sovraccarico e descrive questa parte dell'uso nei documenti. Ho avuto un problema in cui una singola vista gonfiata da XML non si allineava correttamente nel genitore fino a quando non ho apportato questo tipo di modifica.


Infine, grazie :) Ciò consente di aggiungere più viste a un singolo genitore, ma senza la necessità di preoccuparsi dei LayoutParams, che vengono letti dall'XML. Buon lavoro!
Sabo,

13

Anche il modo più semplice è usare

View child = View.inflate(context, R.layout.child, null)
item.addChild(child) //attach to your item

L'utilizzo View.inflate()è il modo migliore, non è necessario LayoutInflatero getSystemService(Context.LAYOUT_INFLATER_SERVICE)di tutti quei fastidi! : D
varun,

8

inflazione del layout

View view = null;
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);
main.addView(view);

6

Se non ti trovi in ​​un'attività, puoi utilizzare il from()metodo statico dalla LayoutInflaterclasse per ottenere un LayoutInflatero richiedere il servizio anche dal metodo contestuale getSystemService():

LayoutInflater i;
Context x;       //Assuming here that x is a valid context, not null

i = (LayoutInflater) x.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//OR
i = LayoutInflater.from(x);

(So ​​che sono passati quasi 4 anni ma vale comunque la pena menzionarli)


4

Se si desidera aggiungere una singola vista più volte, è necessario utilizzare

   layoutInflaterForButton = getActivity().getLayoutInflater();

 for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
        FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);
        btnContainer.addView(btnView);
    }

Se ti piace

   layoutInflaterForButton = getActivity().getLayoutInflater();
    FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);

e

for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
            btnContainer.addView(btnView);
        }

quindi genererà un'eccezione per tutte le viste pronte aggiunte.


4

AttachToRoot impostato su True

Basti pensare che abbiamo specificato un pulsante in un file di layout XML con la larghezza e l'altezza del layout impostate su match_parent.

<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/custom_button">
</Button>

Su questi pulsanti Fare clic su Evento che è possibile impostare il codice seguente per gonfiare il layout su questa attività.

LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.yourlayoutname, this);

Spero che questa soluzione funzioni per te.!


3

Prova questo codice:

  1. Se vuoi solo gonfiare il layout:

View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,null); // Code for inflating xml layout
RelativeLayout item = view.findViewById(R.id.item);   

  1. Se si desidera gonfiare il layout nel contenitore (layout principale):

LinearLayout parent = findViewById(R.id.container);        //parent layout.
View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,parent,false); 
RelativeLayout item = view.findViewById(R.id.item);       //initialize layout & By this you can also perform any event.
parent.addView(view);             //adding your inflated layout in parent layout.


2

Ho avuto il momento più difficile con questo errore, a causa delle mie circostanze uniche, ma alla fine ho trovato una soluzione.

La mia situazione: sto usando una vista separata (XML) che contiene un WebView, quindi si apre in un AlertDialogquando faccio clic su un pulsante nella mia vista attività principale. Ma in qualche modo WebViewappartenevano alla vista principale dell'attività (probabilmente perché estraggo la risorsa da qui), quindi proprio prima di assegnarla alla mia AlertDialog(come vista), ho dovuto prendere il genitore della mia WebView, metterlo in un ViewGroup, quindi rimuovere tutte le visualizzazioni su questo ViewGroup. Questo ha funzionato e il mio errore è andato via.

// set up Alert Dialog box
AlertDialog.Builder alert = new AlertDialog.Builder(this);
// inflate other xml where WebView is
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService
                (Context.LAYOUT_INFLATER_SERVICE);
View v = layoutInflater.inflate(R.layout.your_webview_layout, null);
final WebView webView = (WebView) v.findViewById(R.id.your_webview_id);

// more code...

.... più tardi dopo aver caricato il mio WebView....

// first, remove the parent of WebView from it's old parent so can be assigned a new one.
ViewGroup vg = (ViewGroup) webView.getParent();
vg.removeAllViews();

// put WebView in Dialog box
alert.setView(webView);
alert.show();

2

Se stai cercando di collegare una vista figlio a RelativeLayout? puoi farlo seguendo

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, item, true);

1

Con Kotlin puoi usare:

val content = LayoutInflater.from(context).inflate(R.layout.[custom_layout_name], null)

[your_main_layout].apply {
    //..
    addView(content)
}

-1

Avevo usato sotto il frammento di codice per questo e ha funzionato per me.

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);
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.