2013-02-18 1 views
3

Salut ces questions semblent être assez basique, mais je n'ai pas trouvé de réponse à ce sujet.Où exactement l'inflation de mise en page a lieu?

Lorsque nous setContentView(R.layout.somelayout) alors notre fichier XML de mise en page est gonflé par LayoutInflater service. Mais j'aimerais savoir où cela se passe exactement. Je n'ai trouvé aucun code dans le code source d'activité qui gonfle le fichier XML.

Et également où sont exactement les ID sont générés pour les vues dans le R?

Merci d'avance.

+1

Vous pouvez trouver peu d'infos sur http: // stackove rflow.com/questions/7838921/android-listview-addheaderview-nullpointerexception-for-predefined-views/7839013#7839013 et http://stackoverflow.com/questions/13878053/android-xml-vs-java-layouts-performance/ 13878145 # 13878145 ces deux questions. – user370305

+0

les identifiants sont générés au moment de la compilation par aapt ou l'un d'entre eux. La plupart du gonflement se produit dans LayoutInflater.inflate et rInflate – njzk2

+0

@ njzk2 Je veux dire où le fichier xml (disposition) pour l'activité invoquer inflatter quand nous appelons la méthode setContentView() –

Répondre

5

Moins Documentation et écrit pour la procédure de base et appel invoqué pour setContentView() et d'autres méthodes. En fait, lorsque vous appelez le setContentView(R.layout.<layout_file_name>);. Android nutshell entrer dans l'image, qui va gonfler le fichier de disposition donné à partir de son ID et préparer Voir pour votre activité actuelle et mettre en haut niveau.

What happen when you call setContentView(R.layout.<layout_name>) ?

Le système Android reçoit cette référence et l'utilise pour invalider, mesurer et dessiner l'arbre. Le nœud racine de la hiérarchie demande à ses nœuds enfants de se dessiner eux-mêmes. En tour, chaque nœud de groupe de vues est chargé d'appeler chacune de ses propres vues enfants pour se dessiner. Les enfants peuvent demander une taille et un emplacement dans le parent, mais l'objet parent a la décision finale sur la taille de chaque enfant. Android analyse les éléments de votre mise en page dans l'ordre (à partir du haut de l'arborescence de la hiérarchie), instanciant les vues et les ajoutant à leurs parents. Parce que ceux-ci sont dessinés dans l'ordre, s'il y a des éléments qui chevauchent des positions, le dernier à être tiré sera au-dessus des autres précédemment dessinés à cet espace.

Mise à jour:

Ok, après avoir regardé j'ai trouvé,

Lorsque vous appelez setContentView() de classe de base d'activité, il appelle la méthode abstraite de classe fenêtre de setContentView() qui est la méthode abstraite, et le seul primordial de cette méthode est dans PhoneWindow Classe. Qui ressemble à,

@Override 
    public void setContentView(int layoutResID) { 
     if (mContentParent == null) { 
      installDecor(); 
     } else { 
      mContentParent.removeAllViews(); 
     } 
     mLayoutInflater.inflate(layoutResID, mContentParent); 
     final Callback cb = getCallback(); 
     if (cb != null) { 
      cb.onContentChanged(); 
     } 
    } 

L'inflation de la vue a donc lieu dans cette classe.

Mise à jour: 2 sur la génération de fichiers R.java ..

Aapt(Android Asset Packaging Tool) - Cet outil compile tous les fichiers de mise en page XML et le fichier AndroidManifest.xml. En dehors de la version compilée cela génère aussi un fichier R.java contenant toutes les références des ressources compilées.

Les ressources, stockées dans le sous-répertoire res, incluent des éléments tels que des icônes, des dispositions et des chaînes. Ceux-ci sont compilés à l'aide de l'outil aapt dans un fichier nommé R.java, stocké dans le sous-répertoire .

De AAPT aide

aapt p[ackage] [-d][-f][-m][-u][-v][-x][-z][-M AndroidManifest.xml] \ 
     [-0 extension [-0 extension ...]] [-g tolerance] [-j jarfile] \ 
     [--min-sdk-version VAL] [--target-sdk-version VAL] \ 
     [--max-sdk-version VAL] [--app-version VAL] \ 
     [--app-version-name TEXT] [--custom-package VAL] \ 
     [-I base-package [-I base-package ...]] \ 
     [-A asset-source-dir] [-G class-list-file] [-P public-definitions-file] \ 
     [-S resource-sources [-S resource-sources ...]]   [-F apk-file] [-J R-file-dir] \ 
     [raw-files-dir [raw-files-dir] ...] 

    Package the android resources. It will read assets and resources that are 
    supplied with the -M -A -S or raw-files-dir arguments. The -J -P -F and -R 
    options control which files are output. 

Commande pour AAPT: (Pour HelloWorld Application Android)

aapt \package -v -f -m -M AndroidManifest.xml -S .\bin\res -S .\res \ 
    -I C:\local\android-sdk-windows\platforms\android-15\android.jar \ 
    -J .\gen --generate-dependencies 

Et le résultat ressemble,

Configurations: 
(default) 
hdpi 
ldpi 
mdpi 

Files: 
    drawable\ic_launcher.png 
    Src: (hdpi) .\res\drawable-hdpi\ic_launcher.png 
    Src: (ldpi) .\res\drawable-ldpi\ic_launcher.png 
    Src: (mdpi) .\res\drawable-mdpi\ic_launcher.png 
    layout\main.xml 
    Src:() .\res\layout\main.xml 
    values\strings.xml 
    Src:() .\res\values\strings.xml 
    AndroidManifest.xml 
    Src:() AndroidManifest.xml 

Resource Dirs: 
    Type drawable 
    drawable\ic_launcher.png 
     Src: (hdpi) .\res\drawable-hdpi\ic_launcher.png 
     Src: (ldpi) .\res\drawable-ldpi\ic_launcher.png 
     Src: (mdpi) .\res\drawable-mdpi\ic_launcher.png 
    Type layout 
    layout\main.xml 
     Src:() .\res\layout\main.xml 
    Type values 
    values\strings.xml 
     Src:() .\res\values\strings.xml 
Including resources from package: \ 
C:\local\android-sdk-windows\platforms\android-15\android.jar 
applyFileOverlay for drawable 
trying overlaySet Key=ic_launcher.png 
baseFile 0 has flavor ,,,,,,,,,,,hdpi,,,,,,, 
baseFile 1 has flavor ,,,,,,,,,,,ldpi,,,,,,, 
baseFile 2 has flavor ,,,,,,,,,,,mdpi,,,,,,, 
overlayFile 0 has flavor ,,,,,,,,,,,hdpi,,,,,,, 
overlayFile 1 has flavor ,,,,,,,,,,,ldpi,,,,,,, 
overlayFile 2 has flavor ,,,,,,,,,,,mdpi,,,,,,, 
found a match (0) for overlay file ic_launcher.png, \ 
for flavor ,,,,,,,,,,,hdpi,,,,,,, 
found a match (1) for overlay file ic_launcher.png, \ 
for flavor ,,,,,,,,,,,ldpi,,,,,,, 
found a match (2) for overlay file ic_launcher.png, \ 
for flavor ,,,,,,,,,,,mdpi,,,,,,, 
applyFileOverlay for layout 
applyFileOverlay for anim 
applyFileOverlay for animator 
applyFileOverlay for interpolator 
applyFileOverlay for xml 
applyFileOverlay for raw 
applyFileOverlay for color 
applyFileOverlay for menu 
applyFileOverlay for mipmap 
    (new resource id ic_launcher from \ 
    .\bin\res\drawable-hdpi\ic_launcher.png) 
    (new resource id ic_launcher from \ 
    .\bin\res\drawable-ldpi\ic_launcher.png) 
    (new resource id ic_launcher from \ 
    .\bin\res\drawable-mdpi\ic_launcher.png) 
    (new resource id main from .\res\layout\main.xml) 
    Writing symbols for class R. 
+2

Je pense que l'OP se demande où (dans le code source) inflateur de mise en page coups de pied dans. pouvez-vous le diriger vers le code source android où l'inflation se produit exactement? – waqaslam

+0

@ user370305 basé sur quel algorithme R générer des identifiants ... – Pragnani

+0

@Waqas C'est ce que je veux ... –

Questions connexes