Quelle est la classe R dans Android?

90

Dans AndroidStudio, lorsque je crée un projet à l'aide d'une activité vide, j'obtiens le morceau de code suivant dans le MainActivity.javafichier:

package my.company.my_proj;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

où une classe cryptique nommée Rest utilisée. Quel est le but de ce cours R?

Android Eve
la source

Réponses:

117

Rest une classe contenant les définitions de toutes les ressources d'un package d'application particulier . Il se trouve dans l' espace de noms du package d'application .

Par exemple, si vous dites dans votre manifeste que votre nom de package est com.foo.bar, une Rclasse est générée avec les symboles de toutes vos ressources dans com.foo.bar.R.

Il y a généralement deux R classes que vous traiterez

  1. Les ressources du cadre dans android.Ret
  2. Le vôtre, dans votre espace de noms

Il est nommé Rparce que cela signifie R esources, et il est inutile de faire taper quelque chose plus longtemps, d'autant plus qu'il est courant de se retrouver avec des noms de symboles assez longs après lui, ce qui peut entraîner une bonne quantité de wrapper de ligne.

hackbod
la source
10
Après avoir résolu tous les problèmes et continué avec le livre, je peux ajouter (à partir du livre): Ceci est une classe d'utilitaire générée automatiquement qui fournit des références aux ressources du projet. Elle s'appelle la "classe R" car son nom est R.java . Il est généré par AAPT à partir des ressources définies dans le dossier res .
Android Eve
1
Qu'est-ce que c'est android.R?
Malwinder Singh
12
Il y a un point à obliger les gens à taper quelque chose plus longtemps: cela s'appelle du code propre et n'a peut-être pas encore atteint tout le monde. Les classes à une lettre, les extensions, les variables peuvent peut-être bien dans un contexte local, mais jamais globalement. Des noms laids comme celui-ci mènent à des questions redondantes comme celle-ci.
brainray
23

Qu'est-ce que R: Il n'y a rien de très mystérieux à propos de R. C'est juste une classe qui a de nombreuses sous-classes statiques, ouvrez-la en éclipse et jetez un œil (c'est sous gen /).

Chaque membre de cette classe est l'une des deux choses suivantes: 1) les classes finales statiques ou 2) les entiers finaux statiques qui sont uniques par rapport aux autres membres de leur classe.

Pourquoi est-ce si cryptique: Il est facile de se confondre car R est automatiquement généré par fourmi. C'est énigmatique parce que vous n'êtes pas censé le "toucher" manuellement (bien sûr, vous le pouvez, mais vos modifications seront automatiquement effacées lors de la régénération). C'est également cryptique car parfois éclipse importe automatiquement le fichier R standard des androïdes (comme indiqué dans les réponses ci-dessus)

Pourquoi est-ce toujours le premier qui ne peut pas être résolu: R suit exactement les règles des classes et des packages Java, il n'y a rien de spécial dans la façon dont R agit par rapport à l'importation. R sera automatiquement placé dans le package spécifié par l'entrée de package dans votre fichier manifeste

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="package.which.will.contain.R.and.probably.the.main.package.in.the.application" android:versionName="8.6.2011" android:versionCode="1">
    <uses-sdk android:minSdkVersion="13" />

Pour voir à quel package appartient votre fichier R, ouvrez simplement le dossier gen / dans eclipse (vue packages). Vous verrez un package répertorié ici, il aura le nom que vous avez spécifié dans votre manifeste. Essayez de le supprimer, il reviendra si toutes vos ressources suivent les règles de dénomination correctes et que tous vos fichiers xml suivent les règles xml correctes et si la construction est activée automatiquement dans eclipse.

La clé pour comprendre le fichier R est de se rendre compte qu'il est dans le même package que les autres classes même s'il se trouve dans un répertoire différent de celui des autres fichiers appartenant à votre package "principal". Une fois que vous avez compris cela et compris la syntaxe et la dénomination des fichiers de ressources, le dépannage des problèmes avec R est facile.

tjb
la source
3

R est le nom de vos ressources. Toute ressource à laquelle vous accédez R.$FOLDER.$RESOURCEou quelque chose de très similaire.

S'il ne peut pas être résolu, assurez-vous que le chemin d'accès est correct et que la ressource référencée existe (sensible à la casse; inclure l'extension).

En outre, la partie déroutante (pour moi, en tout cas) est qu'il y a deux différents R. Si vous obtenez de nombreuses erreurs "Impossible de résoudre", essayez de voir ce que vous importez. Essayez de le modifier ou de le supprimer. Ou vous pouvez essayer de nettoyer votre projet (AVERTISSEMENT: cela rend parfois les choses pires qu'elles ne le sont déjà).

John
la source
Oui, nettoyer mon projet semble être une routine quotidienne - l'éclipse se détraque toujours et oublie des choses, mais un bon nettoyage semble arranger les choses (même si je n'ai jamais vu les choses être pires qu'elles ne le sont déjà, comme John le mentionne) .
Brian D
@Brian: Lorsque je nettoie mon projet, Eclipse détruit et régénère mon Rfichier. De temps en temps, il manque l'étape "régénérer" me laissant sans (ou avec un vide) Ret Rest programmé pour annuler automatiquement les changements faits à la main.
John
@John: quel OS utilisez-vous, juste par curiosité?
Brian D
@John, le nettoyage n'aide pas dans mon cas. Vous pouvez voir la liste réelle des erreurs dans ce fil (qui n'a pas encore reçu de réponse): stackoverflow.com/questions/4928784/…
Android Eve
1

Android R.java est un fichier généré automatiquement par AAPT (Android Asset Packaging Tool) qui contient des ID de ressources pour toutes les ressources du répertoire res /. Si vous créez un composant dans le fichier activity_main.xml, l'identifiant du composant correspondant est automatiquement créé dans ce fichier. Cet identifiant peut être utilisé dans le fichier source d'activité pour effectuer toute action sur le composant.

Sahil
la source