web-dev-qa-db-fra.com

Quel est le concept derrière R.java?

Sous Android, R.Java permet d’accéder aux ressources définies dans les fichiers XML. Pour accéder à la ressource, nous devons invoquer la méthode findViewById() en lui transmettant l'identifiant de la ressource à extraire.

Ceci est similaire à Spring où les beans sont définis dans un contexte XML et sont récupérés à l'aide du contexte d'application. context.getBean("beanId")

Ceci fournit un couplage lâche car les fèves sont définies en externe et peuvent être modifiées sans apporter de modifications au code.

Cela m'a confondu. Bien qu'Android ressemble au printemps, quel avantage offre-t-il?

  1. Quel est l'intérêt d'avoir un R.Java intermédiaire de toute façon? Ne pourrions-nous pas simplement acquérir des ressources directement à partir de XML en utilisant un contexte de lecteur de ressources/application. par exemple. findViewById("resourceId")
  2. Il n'y a pas de couplage lâche. Puisque les références dans R.Java sont générées automatiquement, comment pourrait-on supprimer une ressource et en ajouter une nouvelle?
  3. Quel modèle de conception suit-il (s'il en existe un)?
  4. Ne serait-il pas préférable d'avoir des ressources injectées en utilisant IOC (comme Roboguice)? Pourquoi Google a-t-il alors décidé de nous offrir un moyen aussi étrange de travailler avec des ressources?

Pardon mon ignorance. Je suis un développeur Java novice qui essaie trop de choses à la fois. :-) Merci pour tous les commentaires.

36
Monika Michael

Android.R.Java n’est pas seulement oùXMLids sont stockés. Il contient également un accès à des ressources, telles que des objets dessrables, des mises en page, des chaînes, des tableaux et, en gros, tout ce que vous pouvez déclarer dans des ressources.

Personnellement, je trouve que cela est utile lors de l’utilisation d’Eclipse. Je peux simplement taper findViewById(R.id. et Eclipse affichera une info-bulle avec une liste d'options à choisir. 

Cependant, au niveau de la plate-forme, je dirais que les variables id codées en dur permettent d'éviter les erreurs lors de l'utilisation de chaînes pour identifier les ressources - ce qui peut être débogué lors de la programmation (ou lors de la compilation plutôt que lors de l'exécution).

19
Phil

Le plus gros avantage réside dans la localisation et la fourniture de ressources alternatives pour différentes tailles d'écran.

vous pouvez par exemple avoir une ressource String R.string.myname qui peut être définie en anglais dans /values-en/strings.xml et en espagnol dans /values-es/strings.xml

Le système veillera à choisir le bon fichier en fonction de la langue dont vous avez besoin d'utiliser @string/myname dans votre fichier de mise en page ou R.string.myname dans votre code.

De même, vous pouvez définir deux fichiers de mise en forme pour portrait et paysage dans

res/layout/mylayout.xml
res/layout-land/mylayout.xml

Dans votre code, vous devrez simplement spécifier R.layout.mylayout pour gonfler la présentation. Le gestionnaire de ressources Récupère le fichier en mode présentation si le périphérique est en mode paysage.

Faire cela manuellement serait un cauchemar - d'où la nécessité d'un fichier R 

21
Rajdeep Dua

La comparaison se sent quelque peu un peu (en fait) bizarre, parce que vous comparez deux mécanismes basés sur le fait qu'ils utilisent named things pour faire des choses. Par exemple, pour le chargement de ressources, voyez comment la gestion des ressources est effectuée dans le monde .Net.


Il permet à compile-time de vérifier si la ressource est disponible. Parce que sinon, il n'y aura pas de statique à l'intérieur de R.Java qui le pointe. Dans l'exemple Spring, comment pouvez-vous être sûr qu'il existe un bean appelé beanId? Cependant, cela ne permet pas de vérifier s'il s'agit du bon type de la ressource.

Pourquoi est-ce pas lâche? Tant que la nouvelle ressource porte le même nom, elle génère la même constante statique. Au printemps, vous devrez utiliser le même nom de haricot.

Design pattern? Aucun. Il ajoute simplement un niveau d'indirection en nommant les ressources, puis y fait référence uniquement par leur nom, et non en les chargeant directement de leur véritable emplacement.

En fait, les ressources sont injectées, car le chargement des ressources doit faire face à la localisation. Voir ici pour savoir comment Android fait les choses; Dans le monde .Net, des cultures supplémentaires sont regroupées dans des assemblages satellites; le gestionnaire de ressources chargera le bon en fonction de la culture actuelle.

1
Stefan Hanke

Il contient également un accès à des ressources, telles que des identifiants, des dessinables, des mises en page, des chaînes, des tableaux et essentiellement tout ce que vous pouvez déclarer dans des ressources.

0
mass