3 votes

Quelle classe implémente les méthodes du ContextWrapper dans Android ?

Lorsque je développe des applications Android, j'aime jeter un coup d'œil aux implémentations internes du SDK. C'est un énorme Framework et parfois cela aide beaucoup si vous savez comment les méthodes internes sont implémentées.

La dernière vérification des sources que j'ai faite est vraiment déroutante pour moi. J'ai regardé Context pour lire certaines implémentations. Malheureusement, la plupart d'entre elles sont abstraites, c'est pourquoi Android a inventé le ContextWrapper (un modèle d'adaptateur simple).

Le problème est que je n'ai pas pu trouver certaines méthodes qui m'intéressent. Prenons getResources comme exemple. J'ai un ContextObject et j'appelle getResources sur celui-ci. Ce Contexte est une instance de Activity (qui ne met pas en œuvre getResources() par lui-même).

Même chose pour ContextThemeWrapper qui est la classe mère directe de Activity. Le ContextWrapper invoque ensuite getResources() sur son Context membre. Mais qui la met en œuvre alors ?

EDIT : ajout du Snippet de ContextWrapper

public class ContextWrapper{
    Context mContext

    public ContextWrapper(Context ctx){
        mContext = ctx
    }

    public Resourced getResources(){
        return mContext.getResources()
    }

    //... all other Methods are implementing the same AdapterPattern
}

donc la question peut aussi être "quel Contexte est passé au ContextWrapper, qui implémente les méthodes requises".

3voto

Rafael T Points 5817

J'ai finalement trouvé la solution moi-même grâce au conseil utile de nicholas.hausschild, qui consiste à lancer le débogueur.

Malheureusement, cela semble être le seul moyen de le découvrir, car il est implémenté dans une classe appelée ContextImpl qui est lisible par le paquet (bien que non documenté). Vous devez installer Eclipse plugin code source (qui semble être un peu bogué à l'installation, si vous aviez déjà téléchargé et lié le Android-SDK à eclipse) pour voir les sources.

Pour tous ceux qui sont intéressés par ces sources : clickme

2voto

Cory Points 37551

El getResources() sur la méthode Context est abstraite, ce qui signifie que tout ce qui hérite d'elle doit fournir ou remplacer son implémentation. L'implémentation de getResources() sur le ContextWrapper est concrète, et c'est là que vous devez trouver son code.

Aussi, vous avez votre chaîne d'héritage un peu à l'envers. Activity est une sous-classe de ContextThemeWrapper et non l'inverse :

java.lang.Object
  ↳ android.content.Context              // abstract Resources getResources()
    ↳ android.content.ContextWrapper     // Resources getResources()
      ↳ android.view.ContextThemeWrapper // inherits ContextWrapper.getResources()
        ↳ android.app.Activity           // inherits ContextWrapper.getResources()

El Référence pour les développeurs Android vous aidera avec les structures d'héritage.

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