2011-02-10 17 views
62

He intentado duplicar el proyecto de ejemplo de NotePad de modo que si retoqué con los archivos de origen para aprender a través de la experimentación, los archivos de muestra originales no se verán afectados.Android: ¿Qué es R? ¿Por qué es tan críptico?

Por desgracia, a pesar de seguir very clean steps en un ambiente prístino, R se volvió contra mí, again!

Tengo alrededor de 20 "R no se puede resolver a una variable" errores ...

Ahora, esto es como captura 22: Estoy tratando de estudiar la muestra Bloc de notas, por lo que tengo la oportunidad para entender qué es R Pero a R no le gusto tanto, así que no me da la oportunidad de estudiar la muestra de NotePad.

Para colmo de males, cuando busco en Google R, obtengo resultados totalmente irrelevantes.

  1. ¿Qué es R?
  2. ¿Por qué es tan críptico?
  3. ¿Por qué es siempre el primero que no se puede resolver?

Actualización: Me di cuenta de que en el proyecto HelloAndroid (XML versión de diseño), hay un archivo Java generado , llamado R.java. ¿Es este el infame R sobre el que el constructor del proyecto se queja?

+1

@John, pensé que esto es para lo que son las etiquetas. :) Sin embargo, agregaré un prefijo en breve. –

Respuesta

93

R es una clase que contiene las definiciones para todos los recursos de un paquete de aplicación particular. Está en el espacio de nombre del paquete de aplicación.

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

En general, existen dosR clases que se ocupará de

  1. Los recursos marco en android.R y
  2. Su propia en el espacio de nombres

Se nombra R debido a que representa R fuentes, y no tiene sentido hacer que la gente escriba algo más, especialmente Especialmente dado que es común terminar con nombres de símbolos bastante largos después de él, eso puede causar una buena cantidad de envoltura de línea.

+9

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 en el proyecto. Se llama la "clase R" porque su nombre es ** R.java **. Es generado por AAPT del recurso definido dentro de la carpeta ** res **. –

+0

¿Qué es 'android.R'? –

+5

Hay un punto que hace que la gente escriba algo más: se llama código limpio y es posible que todavía no haya llegado a todos. Una letra de clases, extensiones, variables puede ser adecuada en un contexto local, pero nunca global. Nombres tan feos como este conducen a preguntas redundantes como esta. – brainray

2

R es el nombre para sus recursos. Cualquier recurso al que acceda tendrá acceso por R.$FOLDER.$RESOURCE o algo muy similar. Si no se puede resolver, asegúrese de que la ruta sea correcta y que exista el recurso referenciado (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 R's diferentes. Si obtiene muchos errores de "No se puede resolver", intente ver lo que está importando. Intenta cambiarlo o eliminarlo. O puede intentar limpiar su proyecto (ADVERTENCIA: A veces eso empeora las cosas de lo que ya son).

+0

Sí, la limpieza de mi proyecto parece ser una rutina diaria: el eclipse siempre se está volviendo loco y olvidándose de cosas, pero una buena limpieza parece arreglar las cosas (aunque nunca he experimentado cosas peores de las que ya son, como menciona John)) –

+0

@Brian: Cuando limpio mi proyecto, Eclipse destruye y regenera mi archivo 'R'. De vez en cuando, se pierde el paso "regenerar", dejándome sin (o con un vacío) 'R' y' R' está programado para deshacer automáticamente cualquier cambio hecho a mano. – John

+0

@John: ¿qué SO estás usando, solo por curiosidad? –

16

¿Cuál es R: No hay nada muy misterioso en R. Es sólo una clase que tiene muchas subclases estáticas, abrirlo en Eclipse y echar un vistazo (bajo su 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 hormiga. Es críptico porque no debes "tocarlo" manualmente (por supuesto que puedes hacerlo, pero tus cambios se borrarán automáticamente al regenerarse). Su adicionalmente críptica porque a veces eclipse importa automáticamente androides archivo estándar R (como se explica en las respuestas anteriores)

¿Por qué es siempre el primero que no pueda ser resuelto: R sigue las reglas de las clases y los paquetes de Java exactamente, hay es nada especial sobre cómo actúa R con respecto a la importación. R se colocará automáticamente en el paquete especificado por la entrada de paquete en el 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 qué paquete pertenece el archivo de R para simplemente abrir el/carpeta de generación en Eclipse (ver 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 denominación correctas y todos sus archivos xml siguen las reglas xml correctas y si se crea automáticamente está habilitado en eclipse.

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