Chiama per getLayoutInflater () in luoghi non in attività


190

Cosa deve essere importato o come posso chiamare il gonfiatore Layout in luoghi diversi dall'attività?

public static void method(Context context){
    //this doesn't work the getLayoutInflater method could not be found
    LayoutInflater inflater = getLayoutInflater();
    // this also doesn't work 
    LayoutInflater inflater = context.getLayoutInflater();
}

Sono in grado di chiamare getLayoutInflatersolo in attività, è una limitazione? Che cosa succede se desidero creare una finestra di dialogo personalizzata e desidero gonfiare la vista per esso, o cosa succede se voglio avere un messaggio Toast con vista personalizzata che viene mostrato da un servizio, ho solo il contesto dal servizio che non ho alcuna attività ma voglio mostrare un messaggio personalizzato.

Ho bisogno del gonfiatore in punti del codice che non fanno parte della classe di attività.

Come posso fare questo ?

Risposte:


396

Puoi utilizzare queste attività esterne - tutto ciò che serve è fornire un Context:

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

Quindi per recuperare i diversi widget, si gonfia un layout:

View view = inflater.inflate( R.layout.myNewInflatedLayout, null );
Button myButton = (Button) view.findViewById( R.id.myButton );

MODIFICA a partire da luglio 2014

La risposta di Davide su come ottenere il LayoutInflaterè in realtà più corretta della mia (che è comunque valida).


Fantastico, ma ora findViewById non funziona, hai qualche idea al riguardo? inflater.inflate (R.layout.some_layout, (ViewGroup) findViewById (R.id.parent));
Lukap,

nop, il metodo inflater.inflate () non ha un metodo sovraccarico con un solo parametro int, ma immagino che il prossimo potrebbe essere nullo.
Lukap,

@kaspermoerch perché hai detto che la risposta di David è più corretta?
Rohan Bhatia il

1
La risposta di @RohanBhatia Davides non richiede il casting come il mio. Se la chiamata a getSystemServiceper qualche motivo (improbabile) non restituisce un oggetto di tipo, il LayoutInflatermio codice causerebbe un'eccezione di runtime.
Kaspermoerch,

Ha funzionato per me. Grazie
CodeFluid

261

O ...

LayoutInflater inflater = LayoutInflater.from(context);

5
Molto tardi, ma in realtà una risposta migliore in quanto la funzione from verifica anche che si ottiene effettivamente un gonfiatore indietro e genera un errore altrimenti, che sarà molto più facile da gestire con un'esclusione del puntatore nulla da qualche parte nel codice. grepcode.com/file/repository.grepcode.com/java/ext/…
Raanan

38
Così breve, molto gonfiabile
Danyal Aytekin,

@Davide Questa citazione significa che la soluzione di Kaspermoerch è migliore della tua? "Non viene mai utilizzato direttamente. Invece, utilizzare getLayoutInflater () o getSystemService (Class) per recuperare un'istanza LayoutInflater standard che è già collegata al contesto corrente e correttamente configurata per il dispositivo su cui si sta eseguendo." developer.android.com/reference/android/view/LayoutInflater
Tamás Bolvári

@ TamásBolvári È solo più semplice e chiaro, infatti l'implementazione interna è la stessa di Kaspermoerch.
Davide,

11

o

View.inflate(context, layout, parent)


Va bene ; tuttavia, con questo metodo, non posso fornire il booleano "attachToRoot"
DenisGL

Si basa sul requisito, se non è necessario attachToRoot, questo è un metodo di supporto conveniente o passare getRootView () come padre del metodo.
Prakash Nadar,

9

Utilizzando l'oggetto di contesto è possibile ottenere LayoutInflater dal seguente codice

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

1
LayoutInflater.from(context).inflate(R.layout.row_payment_gateway_item, null);

1
Sei incoraggiato a fornire del testo esplicativo insieme al tuo codice.
HansHirse,

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.