¿Qué es la clase R en Android?

90

En AndroidStudio, cuando creo un proyecto usando una actividad vacía, obtengo el siguiente código en el MainActivity.javaarchivo:

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

donde Rse usa una clase críptica nombrada . ¿Cuál es el propósito de esta clase R?

Eva de Android
fuente

Respuestas:

119

Res una clase que contiene las definiciones de todos los recursos de un paquete de aplicación en particular . Está en el espacio de nombres del paquete de la aplicación .

Por ejemplo, si dice en su manifiesto que el nombre de su paquete es com.foo.bar, Rse genera una clase con los símbolos de todos sus recursos en formato com.foo.bar.R.

Generalmente hay dos R clases con las que lidiarás

  1. Los recursos del marco en android.Ry
  2. El tuyo, en tu espacio de nombres

Se nombra Rporque significa R esources, y no tiene sentido hacer que las personas escriban algo más largo, especialmente porque es común terminar con nombres de símbolo bastante largos después, que pueden causar una buena cantidad de envoltura de línea.

hackbod
fuente
11
Después de resolver todos los problemas y continuar con el libro, puedo agregar (del libro): Esta es una clase de utilidad generada automáticamente que proporciona referencias a los recursos del proyecto. Se llama "clase R" porque su nombre es R.java . Es generado por AAPT a partir de los recursos definidos dentro de la carpeta res .
Android Eve
1
¿Qué es android.R?
Malwinder Singh
14
Hay un punto que hace que las personas escriban algo más: se llama código limpio y es posible que aún no haya llegado a todos. Las clases de una letra, extensiones, variables pueden estar bien en un contexto local, pero nunca globalmente. Nombres feos como este conducen a preguntas redundantes como esta.
Brainray
23

Qué es R: No hay nada muy misterioso en R. Es solo una clase que tiene muchas subclases estáticas, ábrela en eclipse y echa un vistazo (está debajo de gen /).

Cada miembro de esta clase es una de dos cosas: 1) clases finales estáticas o 2) enteros finales estáticos que son únicos con respecto a los otros miembros de su clase.

¿Por qué es tan críptico? Es fácil confundirse porque R es generado automáticamente por ant. Es críptico porque se supone que no debes "tocarlo" manualmente (por supuesto que puedes, pero tus cambios se borrarán automáticamente al regenerarse). Además, es críptico porque a veces eclipse importa automáticamente el archivo R estándar de androides (como se discutió en las respuestas anteriores)

¿Por qué siempre es el primero que no se puede resolver? R sigue exactamente las reglas de las clases y paquetes de Java, no hay nada especial en cómo actúa R con respecto a la importación. R se colocará automáticamente en el paquete especificado por la entrada del paquete en su archivo de manifiesto

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

Para ver a qué paquete pertenece su archivo R, simplemente abra la carpeta gen / en eclipse (vista de paquetes). Verá un paquete enumerado allí, tendrá el nombre que especificó en su manifiesto. Intente eliminarlo, volverá si todos sus recursos siguen las reglas de nomenclatura correctas y todos sus archivos xml siguen las reglas xml correctas y si la compilación automática está habilitada en eclipse.

La clave para comprender el archivo R es darse cuenta de que está en el mismo paquete que las otras clases aunque esté en un directorio diferente al de otros archivos que pertenecen a su paquete "principal". Una vez que comprenda esto y comprenda la sintaxis y el nombre de los archivos de recursos, solucionar problemas con R es fácil.

tjb
fuente
3

R es el nombre de sus recursos. Cualquier recurso al que acceda R.$FOLDER.$RESOURCEo algo muy similar.

Si no se puede resolver, asegúrese de que la ruta sea correcta y que el recurso al que se hace referencia exista (distingue entre mayúsculas y minúsculas; incluya la extensión).

Además, la parte confusa (para mí, de todos modos) es que hay dos diferentes R. Si recibe muchos errores "No se puede resolver", intente ver lo que está importando. Intente cambiarlo o quitarlo. O puede intentar limpiar su proyecto (ADVERTENCIA: A veces eso empeora las cosas de lo que ya son).

Juan
fuente
Sí, limpiar mi proyecto parece ser una rutina diaria: el eclipse siempre se vuelve loco y se olvida de las cosas, pero una buena limpieza parece arreglar las cosas (aunque nunca he experimentado que las cosas sean peores de lo que ya son, como menciona John) .
Brian D
@Brian: Cuando limpio mi proyecto, Eclipse destruye y regenera mi Rarchivo. De vez en cuando, pierde el paso de "regenerar" dejándome sin (o con un vacío) Ry Restá programado para deshacer automáticamente cualquier cambio realizado a mano.
Juan
@John: ¿Qué sistema operativo estás usando, solo por curiosidad?
Brian D
@John, la limpieza no ayuda en mi caso. Puede ver la lista real de errores en este hilo (que aún no ha sido respondido): stackoverflow.com/questions/4928784/…
Android Eve
1

Android R.java es un archivo generado automáticamente por AAPT (Herramienta de empaquetado de activos de Android) que contiene ID de recursos para todos los recursos del directorio res /. Si crea cualquier componente en el archivo activity_main.xml, la identificación del componente correspondiente se crea automáticamente en este archivo. Esta identificación se puede utilizar en el archivo de origen de la actividad para realizar cualquier acción en el componente.

Sahil
fuente