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 ?

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


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

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)


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

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

1
Vous êtes encouragé à fournir un texte explicatif avec votre code.
HansHirse

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.