lunes, 27 de mayo de 2013

Android: R cannot be resolved to a variable

Desde ayer sábado, y ahora mismo, estoy teniendo un problema con el entorno de desarrollo de Android en Eclipse. Me está dando un error muy curioso en el que me indican que

R cannot be resolved to a variable

Para explicarlo de forma rápida, R es un objeto que se genera a partir de los recursos que vamos creando en una carpeta interna cuyo nombre es res (procedente de resources). En esa carpeta hay una serie de subcarpetas con sus nombres predefinidos donde se introducen ficheros xml, imagenes, música. Dependiendo de su tipo, se podrá acceder a ellos por el nombre R.tipoDeRecurso.nombreQueLeHemosPuesto.

En fin. La historia es que R debería de existir siempre. Pero, por desgracia, parece ser que a veces se producen una serie de problemas que harán que éste no se vaya regenerando (o que se pierda) y, por lo tanto, nos dará el error que tenemos en el título de este post.

He estado haciendo una serie de búsquedas y estos son los consejos que van dando para solucionarlo. A unos les funciona, a otros (como ahora mismo a mí) no. Recomiendo leer todo hasta el final y después ponerse a probar, no vaya a ser que os llevéis alguna sorpresa. 

  • Hacer un clean y un rebuild del proyecto. Incluso, recomiendan que antes de hacerlo, quitar la opción de build automatically. Todo ello desde el menú proyect.
  • Hacer la primera opción y después, reiniciar el Eclipse. 
  • Verificar los recursos:
    • Los nombres de los recursos tienen que estar siempre en minúsculas. El consejo que dan es que si quieres alguna diferenciación, en vez de utilizar formatoCamello.xml (que estaría mal) utilices formato_no_camello.xml. 
    • No sólo es el nombre del continente el que pueda estar mal, sino también su contenido. Si hay algo mal diseñado, por ejemplo, en algún fichero xml, también podrá dar ese error. Podría ser que, por poner un ejemplo, se esté referenciando en un recurso existente a otro inexistente (por poner un ejemplo: un listado [array], una cadena string [que permitiría hacer internacionalización], etc, etc).
      • Recordar que según para la versión de API (versión mínima para la que se esté programando la aplicaicón), en el layout habrá que ver si estamos utilizando un fill_parent o un match_parent.
  • Parece ser que también podría ser algún tipo de error en la sincronización con el workspace o si se está haciendo un rebuild del mismo. Dicen que podría ser por tener un equipo algo lento. 
  • El hecho de estar importando en tus clases java com.nuestroproyecto.R. Y, aún así, cuando lo hago, me da una alerta (y en vez de no encontrar R, no me encuentra los recursos). Esto te podría pasar, por ejemplo, si utilizas Ctrl+Shift+O para que te importe directamente los paquetes necesarios y te los deje bien ordenados.
  • El fichero AndroidManifest.xml es un fichero base para la aplicación. En él se indican cosas tan importantes como las clases que podrán mostrar las pantallas (clases que heredan de Activity o sus herederos), el estilo de toda la aplicación, etc. Si has reutilizado alguno, ahí tienes el problema. Entre otras cosas, verifica que el paquete en el que debería de encontrar tus Activities es correcto.
  • Botón derecho sobre la carpeta del proyecto, ir a Android tools y después a Fix proyect properties. También míralo si por algún casual has cambiado el nombre del paquete. 
  • En las propiedades del proyecto, ir a java build path y mirar si la librería de Android numversion está con el tick. Hasta ahora no lo estaba, y lo he intentado, pero nada. Aún así, al reparar las propiedades del proyecto, parece que me lo han desmarcado. De todas formas, alguien ha dicho que se le solucionó así. En la pestaña Order and Export tendrían que aparecer tanto la carpeta NombreProyecto/src como NombreProyecto/res.
  • Comprobar si tu sistema operativo es 64 bits y el entorno de desarrollo que usa las librerías y paquetes de Android son para 32 bits. Ya sea el ADT, el jdk... No debería de ser el problema si antes te funcionaba. 
  • Vete a Android SDK Manager, desde el menú Window. Actualiza las cosas que te diga. Entre otras cosas, instala el SDK platform
  • Hay un error que no acabo de entender. Lo llama hierarchical parent error: viene a decir que, si por algún casual debajo de la carpeta gen tienes un R.java, lo elimines. Evidentemente, después tendrás que volver a hacer un clean y, si es que no se hace automáticamente, un rebuild. Yo recomiendo que en este caso no se haga automáticamente. En mi caso, no es posible eliminarlo porque no existe/ha desaparecido. 
  • Hay un ejemplo que ponen en el que la ruta al sdk tiene que terminar en "/" (barra). Es un ejemplo con rutas en Linux. 
  • Copipasteando: "I got this error after i have typied & symbol in string.xml file". 
  • Otro posible error es haber puesto un .js en una carpeta que no sea assets.
  • Eliminar la carpeta /res/raw con todo su contenido, volver a crearla y volver a hacer el proceso clean/rebuild.
  • Actualizar los plugins de Eclipse: Menú Help --> Check for updates. Aunque no sea esto, nunca está de más actualizarlos. ¿No?
  • Otra, que se me estaba ocurriendo mientras que estaba escribiendo estas líneas: reiniciar el ordenador. No es normal que si creas un proyecto totalmente nuevo, te de estos errores. 
  • Si reiniciando veis que sigue dando ese error, podéis volver a probar lo anterior. Por ejemplo, una vez reiniciado, si haciendo limpieza y volviendo a reconstruir no funciona, ni siquiera dándole a la opción del fix con desde las herramientas de Android, puedes ir a sus propiedades, y en el build path mirar si la versión está seleccionada o no (tal y como expliqué más arriba. Es más, recomiendo mirar una vez más las actualizaciones. Si has tenido que actualizar, una vez reiniciado el Eclipse, podrás hacer el clean & build.
En mi caso, he hecho un montón de todas estas cosas, pasando por el clean, rebuild, cerrar y abrir el Eclipse, actualizar todo lo actualizable, reiniciar el equipo, volver al clean, build, ir al java build path... Unas cuantas horas para conseguir solucionar todo esto, y, de paso, de vuelta al proyecto original, que me dejase arreglar cosas que antes no me decía que estuviesen mal. 

Total, que si te da ese problema, estas son muchas de las razones por las que te puede estar dando la brasa y no te deje trabajar. Eso si, si sabéis de alguna otra no enumerada aquí, por favor, ponedla en los comentarios. 

Algunas fuentes de donde he podido obtener esta información:
  • StackOverflow: Algunos de los enlaces aquí referenciados están indicados en las primeras respuestas. De hecho, dos de ellos ya los había encontrado antes de ver esta pregunta.
  • StackOverflow: Bastantes ejemplos/posibles soluciones. Me ha gustado mucho por eso. 
  • StackOverflow: Actualiza el SDK platform, hierarchical parten error,  carácter especial en el strings.xml...
  • Ejemplo, con captura incluida, de los nombres en mayúsculas. Otra solución al otro posible problema:  main cannot be resolved or is not a field. Sustituye main por el nombre del recurso.
  • StackOverflow: Más ejemplos (por ejemplo, las carpetas de Order and Export). $%!¿¡¿?!!. Acabo de perder el enlace a este post.

5 comentarios:

  1. Hola maquina.

    Tuve el problema que comentas, nada más instalar el SDK y probar el típico "Hola Mundo".

    Mi problema estaba relacionado con las ia32-libs. Uso debian wheenzy 64 bits en una arquitectura amd64. Descargue el SDK correcto para x64

    Cosas que tuve que hacer:

    * Dar permisos de ejecución a los ficheros ejecutables del sdk para todos (Propietario/Grupo/Otros).

    * Instalar las ia32-libs. Segui los siguientes comandos:

    dpkg --add-architecture i386
    apt-get update
    apt-get install libc6:i386

    Y como no funciono hice

    apt-get install ia32-libs

    ResponderEliminar
    Respuestas
    1. ¡Hola!

      Muchas gracias por tu aportación. Es una ayuda más para aquellos que lo necesiten. Con esto ampliamos el conocimiento no que no haya podido poner. :D

      Eliminar
  2. Ejemplo, con captura incluida, de los nombres en mayúsculas. Otra solución al otro posible problema: main cannot be resolved or is not a field. Sustituye main por el nombre del recurso


    Gracias

    ResponderEliminar
    Respuestas
    1. Muchas gracias por tu aportación. Siempre vienen bien ejemplos que no se hayan expuesto aquí. :D

      Eliminar
  3. Buen artículo.
    Añado que en mi caso me dio ese error al importar un proyecto de ejemplo y lo solucioné al elegir en las Propiedades del proyecto ->Android->Project build target: Android 4.0.3, estaba marcado por defecto Android 2.3.3
    Ya digo que era un proyecto que importé, un ejemplo y daba ese error.

    ResponderEliminar