2012-06-04 1 views
1

J'utilise l'interface Factory sur LayoutInflater pour pouvoir définir une police personnalisée sur tous mes TextView dans mon application. Malheureusement, il y a des endroits dans mon application où cela ne fonctionne pas. Après enquête, il semble que dans l'adaptateur de ma ListView par exemple, le LayoutInflater utilisé pour gonfler les cellules est différent de celui qui a été utilisé pour le reste de l'application (mon activité a une structure complexe avec des Fragments).Combien de LayoutInflater sont instanciés dans une application?

Est-ce que ce comportement est normal? Comment puis-je m'assurer que le même LayoutInflater est toujours utilisé, quelle que soit la façon dont je le récupère?

Merci

+0

** Malheureusement, il ya des endroits dans mon application où cela ne fonctionne pas. ** Que signifie «ça ne marche pas»? Comme AedonEtLIRA dit dans leur réponse, postez le code qui ne fonctionne pas. – Squonk

Répondre

0

Je ne pense pas que la quantité de LayoutInflaters est vraiment important (sauf si vous êtes littéralement des milliers). Mais, oui, l'utilisation de plusieurs Inflateurs est en effet normale. J'en utilise pas mal quand je travaille avec les vues de mon adaptateur (comme je n'en utilise pas une statique, chaque adaptateur n'en utilise qu'une).

S'il y a des endroits dans votre code que l'adaptateur ne fonctionne pas, il vous manque probablement quelque chose. Je posterais le code où l'Inflater ne fonctionne pas.

1

que vous obtenez référence à LayoutInflater de Context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) (ViewGroup.inflate et Activity.getLayoutInflater ne sont que des emballages pratiques) Je suppose qu'il retourne toujours référence au même service de gonfleur, jusqu'à ce qu'il soit détruit et recréé, puis ce nouvellement créé est retourné, et ainsi sur ... Je suppose que l'objet manager obtenu à partir de la méthode getSystemService est similaire aux objets liants du service "normal".

EDIT: Et dire ci-dessus, je me trompais;)

j'ai vérifié le code source et android.view.ContextThemeWrapper (ce qui est super classe activitie):

@Override public Object getSystemService(String name) { 
    if (LAYOUT_INFLATER_SERVICE.equals(name)) { 
     if (mInflater == null) { 
      mInflater = LayoutInflater.from(mBase).cloneInContext(this); 
     } 
     return mInflater; 
    } 
    return mBase.getSystemService(name); 
} 

et Android .app.ContextImpl qui est probablement MBASE mise en œuvre Contexte:

public Object getSystemService(String name) { 
    ServiceFetcher fetcher = SYSTEM_SERVICE_MAP.get(name); 
    return fetcher == null ? null : fetcher.getService(this); 
} 

où: private static final HashMap SYSTEM_SERVICE_MAP = new HashMap(); ServiceFetcher est une classe interne pour la mise en cache et la récupération des "instances de service système".

Ce qui est certain, c'est qu'il y a un LayoutInflater par activité/ContextWrapper. Pour plus d'observations étudier les sources, s'il vous plaît;)

Questions connexes