Appel à getLayoutInflater () dans des endroits non actifs

190

Que faut-il importer ou comment puis-je appeler le gonfleur de mise en page dans des endroits autres que l'activité?

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

Je ne peux appeler getLayoutInflaterqu'en activité, est-ce une restriction? Que faire si je veux créer un dialogue personnalisé et que je veux gonfler la vue pour cela, ou que faire si je veux avoir un message Toast avec une vue personnalisée qui est affichée à partir d'un service, je n'ai que le contexte du service Je n'ai aucune activité mais je veux afficher un message personnalisé.

J'ai besoin du gonfleur à des endroits du code qui ne sont pas dans la classe d'activité.

Comment puis-je faire ceci ?

Lukap
la source

Réponses:

396

Vous pouvez utiliser ces activités extérieures - tout ce dont vous avez besoin est de fournir Context:

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

Puis pour récupérer vos différents widgets, vous gonflez une mise en page:

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

EDIT en juillet 2014

La réponse de Davide sur la façon d'obtenir le LayoutInflaterest en fait plus correcte que la mienne (qui est toujours valable cependant).

kaspermoerch
la source
Génial, mais maintenant que findViewById ne fonctionne pas, avez-vous des idées à ce sujet? inflater.inflate (R.layout.some_layout, (ViewGroup) findViewById (R.id.parent));
Lukap
non, la méthode inflater.inflate () n'a pas de méthode surchargée avec un seul paramètre int, mais je suppose que le suivant pourrait être nul.
Lukap
@kaspermoerch pourquoi avez-vous dit que la réponse de David est plus correcte?
Rohan Bhatia
1
La réponse @RohanBhatia Davides ne nécessite pas de casting, contrairement au mien. Si l'appel à getSystemServicepour une raison (peu probable) ne retourne pas un objet de type, LayoutInflatermon code provoquerait une exception d'exécution.
kaspermoerch
A travaillé pour moi. Merci
CodeFluid
261

Ou ...

LayoutInflater inflater = LayoutInflater.from(context);
Davide
la source
5
Très tard, mais en fait une meilleure réponse car la fonction from vérifie également avec affirmation que vous récupérez réellement un gonfleur et renvoie une erreur dans le cas contraire - ce qui sera beaucoup plus facile à traiter qu'une excpetion de pointeur nul quelque part dans le code. grepcode.com/file/repository.grepcode.com/java/ext/…
Raanan
38
Si bref, beaucoup gonflé
Danyal Aytekin
@Davide Cette citation signifie-t-elle que la solution de kaspermoerch est meilleure que la vôtre? "Il n'est jamais utilisé directement. Au lieu de cela, utilisez getLayoutInflater () ou getSystemService (Class) pour récupérer une instance de LayoutInflater standard déjà connectée au contexte actuel et correctement configurée pour le périphérique sur lequel vous exécutez." developer.android.com/reference/android/view/LayoutInflater
Tamás Bolvári
@ TamásBolvári Ce n'est que plus simple et plus clair, en fait la mise en œuvre interne est la même que l'écriture de Kaspermoerch.
Davide
11

ou

View.inflate(context, layout, parent)

Prakash Nadar
la source
C'est très bien ; cependant, avec cette méthode, je ne peux pas fournir le booléen "attachToRoot"
DenisGL
Il est basé sur l'exigence, si vous n'avez pas besoin de attachToRoot, il s'agit d'une méthode d'assistance pratique ou passez getRootView () comme parent de la méthode.
Prakash Nadar
9

En utilisant un objet de contexte, vous pouvez obtenir LayoutInflater à partir du code suivant

LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
anujprashar
la source
1
LayoutInflater.from(context).inflate(R.layout.row_payment_gateway_item, null);
Sikander Bakht
la source
1
Vous êtes encouragé à fournir un texte explicatif avec votre code.
HansHirse
1
LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );

Utilisez ceci à la place!

Brian Tompsett - 汤 莱恩
la source