Qual è la classe R in Android?


90

In AndroidStudio, quando creo un progetto utilizzando un'attività vuota, ottengo la seguente parte di codice nel MainActivity.javafile:

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);
    }
}

dove Rviene utilizzata una classe criptica denominata . Qual è lo scopo di questa lezione R?

Risposte:


119

Rè una classe contenente le definizioni per tutte le risorse di un particolare pacchetto dell'applicazione . Si trova nello spazio dei nomi del pacchetto dell'applicazione .

Ad esempio, se dici nel tuo manifest il nome del tuo pacchetto è com.foo.bar, Rviene generata una classe con i simboli di tutte le tue risorse in formato com.foo.bar.R.

In genere ci sono due R classi di cui ti occuperai

  1. Le risorse del framework in android.Re
  2. Il tuo, nel tuo spazio dei nomi

Prende il nome Rperché questo sta per R isorse, e non v'è alcun punto nel rendere le persone tipo qualcosa di più, soprattutto perché è comune per finire con i nomi dei simboli piuttosto molto tempo dopo che, che può causare una discreta quantità di linea di involucro.


11
Dopo aver risolto tutti i problemi e aver proceduto con il libro, posso aggiungere (dal libro): Questa è una classe di utilità generata automaticamente che fornisce riferimenti alle risorse del progetto. Si chiama "classe R" perché il suo nome è R.java . Viene generato da AAPT dalle risorse definite nella cartella res .
Android Eve

1
Che cos'è android.R?
Malwinder Singh

14
C'è un punto che costringe le persone a digitare qualcosa di più lungo: si chiama codice pulito e potrebbe non essere ancora arrivato a tutti. Classi di una lettera, estensioni, variabili possono andare bene in un contesto locale, ma mai a livello globale. Nomi brutti come questo portano a domande ridondanti come questa.
brainray

23

Cos'è R: Non c'è niente di molto misterioso in R. È solo una classe che ha molte sottoclassi statiche, aprila in eclipse e dai un'occhiata (è sotto gen /).

Ogni membro di questa classe è una delle due cose: 1) classi finali statiche o 2) interi finali statici che sono unici rispetto agli altri membri della loro classe.

Perché è così criptico: è facile confondersi perché R è generato automaticamente da ant. È criptico perché non dovresti "toccarlo" manualmente (ovviamente puoi ma le tue modifiche verranno automaticamente cancellate al momento della rigenerazione). È inoltre criptico perché a volte eclipse importa automaticamente il file R standard di androidi (come discusso nelle risposte sopra)

Perché è sempre il primo che non può essere risolto: R segue esattamente le regole delle classi e dei pacchetti Java, non c'è nulla di speciale nel modo in cui R si comporta rispetto all'importazione. R verrà automaticamente inserito nel pacchetto specificato dalla voce del pacchetto nel file manifest

<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" />

Per vedere a quale pacchetto appartiene il tuo file R, apri semplicemente la cartella gen / in eclipse (vista pacchetti). Vedrai un pacchetto elencato lì, avrà il nome che hai specificato nel tuo manifest. Prova a eliminarlo, tornerà se tutte le tue risorse seguono le regole di denominazione corrette e tutti i tuoi file xml seguono le regole xml corrette e se la build automaticamente è abilitata in eclipse.

La chiave per comprendere il file R è rendersi conto che è nello stesso pacchetto delle altre classi anche se si trova in una directory diversa da quella degli altri file appartenenti al pacchetto "principale". Dopo aver compreso questo e compreso la sintassi e la denominazione dei file di risorse, la risoluzione dei problemi con R. è facile.


3

R è il nome delle tue risorse. Qualsiasi risorsa a cui accedi R.$FOLDER.$RESOURCEo qualcosa di molto simile.

Se non può essere risolto, assicurati che il percorso sia corretto e che la risorsa di riferimento esista (distingue tra maiuscole e minuscole; includi l'estensione).

Inoltre, la parte che crea confusione (per me, comunque) è che ci sono due diversi R. Se ricevi molti errori "Impossibile risolvere", prova a vedere cosa stai importando. Prova a modificarlo o rimuoverlo. Oppure puoi provare a pulire il tuo progetto (ATTENZIONE: a volte questo peggiora le cose di quanto non siano già).


Sì, pulire il mio progetto sembra essere una routine quotidiana: eclipse va sempre in tilt e dimentica le cose, ma una buona pulizia sembra sistemare le cose (anche se non ho mai sperimentato che le cose siano peggiori di quanto non siano già, come menziona John) .
Brian D

@ Brian: Quando pulisco il mio progetto, Eclipse distrugge e rigenera il mio Rfile. Di tanto in tanto salta il passaggio di "rigenerazione" lasciandomi senza (o con un vuoto) Red Rè programmato per annullare automaticamente le modifiche apportate a mano.
John

@ John: che sistema operativo stai usando, solo per curiosità?
Brian D

@ John, la pulizia non aiuta nel mio caso. Puoi vedere l'elenco effettivo degli errori in questo thread (a cui non è stata ancora data risposta): stackoverflow.com/questions/4928784/…
Android Eve

1

Android R.java è un file generato automaticamente da AAPT (Android Asset Packaging Tool) che contiene gli ID risorsa per tutte le risorse di res / directory. Se crei un componente nel file activity_main.xml, l'ID del componente corrispondente viene creato automaticamente in questo file. Questo ID può essere utilizzato nel file di origine dell'attività per eseguire qualsiasi azione sul componente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.