210 votes

Appel à getLayoutInflater() dans des endroits qui ne sont pas dans l'activité

Que faut-il importer ou comment puis-je appeler l'inflateur de mise en page ailleurs que dans 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 suis capable d'appeler getLayoutInflater seulement en activité, est-ce une restriction ? Que se passe-t-il si je veux créer un dialogue personnalisé et que je veux gonfler la vue pour celui-ci, ou 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 pas d'activité mais je veux afficher le message personnalisé.

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

Comment faire ?

439voto

kaspermoerch Points 7580

Vous pouvez utiliser cette activité en dehors de l'entreprise - il suffit de fournir une Context :

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

Ensuite, 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 date de juillet 2014

Davide réponse sur la façon d'obtenir le LayoutInflater est en fait plus correct que le mien (qui reste cependant valable).

0 votes

Super, mais maintenant le findViewById ne fonctionne pas, avez-vous des idées à ce sujet ? inflater.inflate(R.layout.some_layout, (ViewGroup) findViewById(R.id.parent)) ;

0 votes

Nop, la méthode inflater.inflate() n'a pas de méthode surchargée avec un seul paramètre int, mais je suppose que le paramètre suivant pourrait être null.

0 votes

@kaspermoerch pourquoi avez-vous dit que la réponse de David est plus correcte ?

297voto

Davide Points 745

Ou ...

LayoutInflater inflater = LayoutInflater.from(context);

5 votes

Très tard, mais c'est en fait une meilleure réponse car la fonction from vérifie également avec assert que vous obtenez bien un gonfleur en retour et lance une erreur sinon - ce qui sera beaucoup plus facile à gérer qu'une excpetion de pointeur nul quelque part dans le code. grepcode.com/file/repository.grepcode.com/java/ext/

41 votes

Si bref, si gonflé

0 votes

@Davide Cette citation signifie-t-elle que la solution de kaspermoerch est meilleure que la vôtre ? "Il n'est jamais utilisé directement. Utilisez plutôt getLayoutInflater() ou getSystemService(Class ) pour récupérer une instance standard de LayoutInflater qui est déjà accrochée au contexte actuel et correctement configurée pour le périphérique sur lequel vous vous exécutez." developer.Android.com/reference/Android/view/LayoutInflater

12voto

Prakash Nadar Points 874

Ou

View.inflate(context, layout, parent)

0 votes

C'est bien ; cependant, avec cette méthode, je ne peux pas fournir le booléen "attachToRoot".

0 votes

Si vous n'avez pas besoin de attachToRoot, il s'agit d'une méthode d'aide pratique ou vous pouvez passer getRootView() comme parent à la méthode.

11voto

anujprashar Points 3301

En utilisant l'objet contextuel vous pouvez obtenir LayoutInflater à partir du code suivant

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

4voto

Sikander Bakht Points 11
LayoutInflater.from(context).inflate(R.layout.row_payment_gateway_item, null);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X