Saltar al contenido

Android Studio 3.1.3 – Referencia sin resolver: R – Kotlin

Solución:

El problema puede deberse a muchos factores,

  • como lo menciona martomstom en esta respuesta, el problema a veces es causado por com.android.tools.build:gradle versión, cambiar su versión a una más estable resolvería el problema: por ejemplo: com.android.tools.build:gradle:3.4.0-alpha02 con com.android.tools.build:gradle:3.2.1
  • Además, tener bibliotecas del mismo grupo, pero con diferentes versiones puede causar el problema o incluso más errores en tiempo de ejecución. use el método de grupo de exclusión como el siguiente: implementation('com.squareup.picasso:picasso:2.71828') { exclude(group: 'com.android.support') } en este caso, la biblioteca de picasso usa componentes android.support, la versión de la biblioteca de Android utilizada en picasso es diferente a la que está usando actualmente en su aplicación, por lo que para resolver este problema, tenemos que excluirlo completamente de su sub biblioteca y grupos de clases.

  • También puede suceder por la falta de coincidencia de recursos y código, incluir esta línea de importación en su actividad también puede resolver el problema: import com.package.name.R

  • A veces puede suceder por el IDE, el rendimiento o la memoria. Limpiar el proyecto de vez en cuando puede ahorrarle algo de tiempo, en Android Studio sería algo como esto: Build -> Clean Project / Rebuild Project La limpieza del efectivo IDE también ayuda con el rendimiento y la memoria, en Android Studio se vería así: File-> Invalidate Chases/ Restart -> Invalidate Cashes and Restart
  • Noté que este problema me ocurre la mayor parte del tiempo al importar nuevos recursos, el uso de caracteres prohibidos en sus nombres dispararía el error, como . , , - , UpperCase or special Letters
  • Y como sugerencia, si estás usando Kotlin, realmente recomiendo usar extensiones de Kotlin en su actividad, como: importar kotlinx.android.synthetic.main.activity_page.* o si está usando una vista personalizada: kotlinx.android.synthetic.main.view_layout.view.*
    después, en el método onCreat () de una actividad, solo tendrás que llamar al id, por ejemplo: my_edit_text_ID.text = "Kotlin Dbest!"o desde una vista personalizada: mCostumView.my_edit_text_ID.text = "Kotlin Dbest!"

EDITAR:

  • Me he enfrentado a este problema de nuevo y el problema fue que la biblioteca ” R ” se importó de 2 fuentes diferentes:

    com.android.R

    com.example.package.R

    Solo debe importar la biblioteca ” R ” con el nombre del paquete de su aplicación, en este caso com.example.package.R
    A veces, la biblioteca no se importa en absoluto, para importarla, haga clic en la referencia no resuelta R y presione Alt + Enter

EDITAR:

Como tobltobs mencionado en la sección de comentarios: “La mayoría de las veces, el problema es causado por otro error que evita que el sistema de compilación cree fuentes generadas. Para encontrar la causa raíz, mire el registro de Gradle (el ícono de” vista de alternancia “debajo del martillo verde en la salida de Build) y busque errores no relacionados con R o BuildConfig (también generado). Si no queda ningún otro error y el problema con R persiste, tal vez algo de esta lista pueda ayudar “.

Usé com.android.tools.build:gradle:3.3.0-alpha13 y tuve el mismo problema. Cambiar a la versión estable 3.2.1 me solucionó este problema.

Entonces este es un error engañoso. La forma más rápida de llegar a la causa raíz es ejecutar:

bash gradlew assembleDebug --debug

luego, desplácese hacia arriba y busque el error real.

Sin embargo, si todavía no parece que tenga la respuesta que está buscando, siga leyendo.

Voy a explicar la vista de 30.000 pies de lo que está sucediendo. Este no es un orden EXACTO o un flujo EXACTO, simplemente está bastante cerca;) así que si sabes más de lo que yo hago del orden exacto y me preocupo por hacer correcciones con enlaces, no dudes en no detenerte :).

El proceso

El archivo R es un código generado.

Hay un orden en la generación.

Gradle hará su magia, extraerá sus dependencias e iniciará su árbol de advertencias y errores primero,

luego, Android convierte todo Kotlin a Java entre bastidores. Sí, es cierto, nuestro querido Kotlin todavía tiene que ser Java para compilar para nuestra querida máquina virtual ART.

Luego se ejecuta y hace los adaptadores que ha creado para JVM Statics y algunas otras tareas. A continuación, compila todos los archivos de enlace de datos xml primero para crear los archivos de enlace de datos generados.

Si todo tiene éxito, pasa al procesamiento de activos y recursos. Lo que crea punteros o ID para cada recurso al que hace referencia en el código. A continuación, se ejecutará y comenzará a compilar el código y el proceso de empaquetado después de eso.

Proceso bastante sencillo, pero aquí radica el problema.

El error engañoso

Si algún paso falla antes de que se complete la generación R, entonces la R no se genera. A veces, una simple reconstrucción es todo lo que necesita hacer, a veces un simple Archivo-> Invalidar caché y reiniciar es todo lo que necesita. Sin embargo, la mayoría de las veces tiene un problema de código en su gradle, su xml, su enlace de datos o sus adaptadores que impiden que el compilador llegue incluso a la etapa de generación R.

Entonces la siguiente pregunta es

“Bueno, dispara, ¿cómo lo solucionamos si los errores son inútiles o inexistentes?”.

Bueno, primero hablemos de las muchas formas en que se presentan estos errores.

  • Se encontró una clase de enlace de datos duplicada
  • xml Error de enlace en la línea #
  • No se pudo encontrar la firma coincidente de bind: customAdapterMethod
  • No se puede encontrar el archivo R del proyecto correcto, solo muestra opciones de importación para submódulos o archivos R de espacio de nombres incorrectos.
  • No se pudo encontrar DataBindingUtility o DataBinding para actividad / fragmento
  • Y muchas otras formas también, demasiadas para enumerarlas todas

A continuación, hablemos de los posibles candidatos que causan el problema. Como hay tantos jejeje.

  • Problemas de sincronización de Gradle
  • Versiones incorrectas de Gradle o Tools, es posible que haya avanzado demasiado en la última modificación del archivo de Gradle. Intenta retroceder una versión e “invalidar la caché y reiniciar” si eso lo solucionó, genial, si no, sigue leyendo.
  • Problemas de almacenamiento en caché (Archivo-> Reiniciar e invalidar caché)
  • elementos xml con espacio de nombres incorrecto
  • elementos xml con ID incorrectos o ID de referencia desordenados (es decir, dice alinear a la derecha de un elemento que está más abajo en el documento xml que el elemento hermano que está tratando de hacer referencia a él)
  • Problemas de enlace de datos xml que hacen referencia al espacio de nombres o miembro que no existe o no está escrito correctamente
  • Problemas de enlace de datos xml en lugares que no se completan automáticamente, como atributos personalizados que usan adaptadores, ya que son más difíciles de detectar. es decir, unir:[email protected]”myObject.mistypedProperty ()”
  • Adaptadores estáticos de JVM con problemas o firmas duplicadas
  • Carácter duplicado o incorrecto en el archivo Strings o Dimens o cualquier otro archivo xml para el caso
  • Variable privada marcada para @Binding sin propiedades para acceder a ella
  • Variable miembro marcada para @Binding que coincide con un método de clase padre que causa duplicaciones que se manifiestan en errores casi imposibles
  • Discrepancia de tipos, como usar un adaptador que toma (Int) pero está pasando (Int?) A través del enlace de datos y no se reconoce con JVM Statics hasta el momento de la compilación
  • Seleccionó IMPORT en una ventana emergente para importar el archivo R de un submódulo en lugar del archivo de la aplicación
  • Tener miembros enlazables en una clase secundaria o primaria, pero no dar un espacio de nombres totalmente calificado a la conversión de clase en el uso de XML de la clase primaria o secundaria. Como el compilador de enlace de datos no es lo suficientemente inteligente como para darse cuenta de que la variable proporcionada para la clase Foo también es parentFoo baseclass, debe calificarla como android: text = “@ ((com.path.parentFoo) foo) .parentMethod”
  • Tener un nombre de método en una clase, que coincida con una “propiedad generada a partir de la variable miembro @Binding”, es decir, firstName como variable, pero luego tener un método llamado getFirstName en una clase principal o secundaria, porque ahora está haciendo coincidir un nombre de método que se genera automáticamente, lo que provoca errores de clase de duplicación de dataBindingUtility.
  • Hay más causas, pero esto debería darle una serie de lugares para buscar, pero la lista puede seguir y seguir seriamente.

Desafortunadamente, esto sucede mucho en tecnologías de vanguardia donde las herramientas de la interfaz de usuario aún no están al día con las herramientas basadas en terminales. Así que le sugiero que ejecute desde la raíz del proyecto en una terminal con

bash gradlew assembleDebug --debug

Cuando falle, y lo hará. Comience a desplazarse hacia arriba a través de los registros hasta que encuentre el rojo donde vea lo que realmente está fallando y evitando que ocurra la siguiente etapa.

Esto le resultará especialmente útil cuando empiece a trabajar con el enlace de datos.

PROPINA:

Cuando comience a lidiar con el enlace de datos, asegúrese de compilar y ejecutar con frecuencia porque el objetivo es reconocer de inmediato antes de hacer otros archivos para asegurarse de no romper la generación y hacer su vida MUCHO más fácil saber que el código que acaba de agregar causó el problema antes de llegar demasiado lejos.

Tiempos para compilar y ejecutar para confirmar que no hay problemas antes de continuar.

  • Si agrega algunas estadísticas de JVM, compile y ejecute
  • Si agrega variables a su XML para usar
  • Si se vincula a las propiedades de su modelo en 1 archivo
  • Si agrega un enlace a un JVMStatic
  • Si agrega propiedades o miembros enlazables a un modelo
  • Si refactoriza el movimiento de propiedades o variables de miembros observables a clases secundarias o base
  • Cualquier otro xml o elementos relacionados con el enlace que puedan afectar el código generado.

Como mencioné anteriormente, la razón es evitar tantos cambios, por lo que se convierte en una pesadilla para la resolución de problemas encontrar un error genérico, vago y horrible relacionado con el código de enlace de datos generado. Estoy seguro de que las herramientas mejorarán, pero por ahora, hágase un favor y compile y ejecute con frecuencia cuando cambie elementos relacionados con Databinding.

Codificación feliz

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *