Estoy usando Data Binding en mi proyecto, cuando uso <layout>
y <data>
en mi clase de enlace xml no se genera.
Por ejemplo, tengo activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data> </data>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
</RelativeLayout>
</layout>
Ahora, si estoy escribiendo ActivityMainBinding
en mi actividad / fragmento, muestra un error de que la clase no está disponible. Pero después de incluirlo <variable>
en mi archivo xml, puede generar ActivityMainBinding
clases.
Android Studio: 2.1.3
Classpath: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0
dataBinding.enabled
en tu build.gradle?ActivityMainBinding
, o tiene que hacer algo con este error.<variable>
en xml<variable>
, genera una clase vinculante sin proyecto de construcción.Respuestas:
No obtuve ninguna respuesta satisfactoria. Así que aquí están los consejos que son un resumen de mi conocimiento de vinculación de datos.
Consejos para resolver problemas de enlace de datos
Actualizar
Para obtener errores y sugerencias más precisos , recomiendo encarecidamente actualizar la versión del complemento de Android Studio y Gradle a la última versión. Porque no tengo muchos problemas después de la versión AS 3.2.
Consulte la última versión de Android Studio y el último complemento de Gradle .
Solución original
Compruebe estos puntos uno por uno. Cualquiera de estos puede hacer su trabajo. El punto 3 al final es muy importante, así que no se los pierda.
1. Compruebe si el enlace de datos está habilitado
Debería tener habilitado el enlace de datos en
build.gradle
. Si no es así, agregue esto y Sync .2. El diseño de cheques se convierte en diseño de encuadernación
Ahora, si desea que se genere una clase de enlace de datos, debe ajustar
xml layout
con el enlace de datos (<layout
etiqueta). Algo como esto.Junto con esto, verifique si los nombres de las variables vinculantes son correctos como en la clase de modelo de vista
3. ¿Nombre de clase de enlace generado automáticamente?
Su clase de enlace de datos debe generarse después de crear el diseño de enlace.
4. ¿No puede ver la sugerencia de importación?
A veces, cuando escribe
ActivityMai...
, no muestra la sugerencia , en ese caso, importe manualmente .5. Leer Build Fail Logcat
Su clase de enlace y las nuevas variables en el diseño no se generarán si su compilación falla. Así que primero Make project con Ctrl + F9 (Build> Make project) .
6. Cierre y abra el proyecto de reciente
Siempre hago esto porque lleva mucho menos tiempo que
Rebuild
/Make
project.Tenga en cuenta que prefiero Cerrar y Abrir desde Reciente porque lleva mucho menos tiempo que Rebuild / Restart IDE .
7. Proyecto de reconstrucción
Si aún no se genera su clase. (En algún momento cuando pegamos el archivo de diseño, entonces sucede). Luego, reconstruir proyecto desde
Build> Rebuild
( no construir o hacer proyecto ). Generará su clase de enlace de datos. ( Rebuild hace magia por mí. )8. Tener la última versión de Android Studio
Después de actualizar AS a Android Studio 3.2 , sentí que se corrigían muchos errores en la generación automática de enlace de datos. Por lo tanto, también debe tener el último AS.
Solución para
<variables
Por lo general, cuando colocamos una variable en el diseño, crea un captador y un definidor de ella. Y podemos usar
binding.setItem(item);
ybinding.getItem();
, pero si no puede ver esos métodos, lea la siguiente información.1. Cierre y abra el proyecto reciente.
Si ha creado una variable de datos,
<variable
en su diseño y no muestra su establecedor y captador en la clase de enlace de datos, entonces Cerrar y Abrir desde Reciente su proyecto.2. Proyecto limpio después de cambiar el tipo
Si cambió el tipo de algunos
<variable
en su diseño y el tipo de setter getter no cambia, entonces Limpiar proyecto (Build> Clean Project
)Ultimas palabras
Finalmente, si aún no se genera su clase de enlace, entonces tenemos nuestra arma más poderosa. - Reinicie Android Studio: D
Esto es todo lo que hago para resolver mis errores de vinculación de datos. Si tiene más problemas, puede comentar aquí.
fuente
Clase DataBinding generada automáticamente.
si su nombre xml es activity_test, la clase Binding será ActivityTestBinding.
pero,
el diseño debe tener el diseño como raíz
fuente
ConstraintLayout
como raíz. ¡Gracias!Tuve el mismo problema. Después de leer los documentos sdk de Android, solo se debe crear el nombre de archivo esperado, pero no hay nada sobre qué hacer si no sucede. Después de investigar un poco más, noté que después de eliminar el espacio de nombres del elemento de diseño como se muestra a continuación (usando su ejemplo), funcionó para mí.
fuente
En mi caso, la clase Binding se generó y se instaló (pero pensé que no lo estaba) ... pero no agrega automáticamente la importación de dicha clase a la sección de importación de actividad / fragmento ... así que ... OPCIÓN + ENTRAR :)
fuente
Después de haberlo configurado correctamente (incluido el espacio de nombres xml y envolver todo en
<layout>
), el que funcionó para mí fue Build -> Make project. Ni Clean Project o Rebuild Project lo hicieron. Estoy en Android Studio 2.3.1, usando herramientas de compilación 26.0.2. No hay necesidad de<data>
etiquetas.fuente
si realiza el trabajo base, para habilitar el enlace de datos en su proyecto, como use enable en gradle y use etiqueta de diseño en xml , cuando cambia el código xml y no generó una nueva clase de vinculación de datos para esos xml, puede usar una forma rápida para generar solo datos clase de enlace en gradle-> otro-> databindinggenbaseclassesDebug rápido más que bulid todo el proyecto. su genera solo clase de enlace de datos.
fuente
Para habilitar el nuevo compilador de enlace de datos, agregue la siguiente opción a su archivo gradle.properties:
fuente
Las clases de enlace de datos se generan durante la compilación, por lo que después de habilitar el enlace de datos en la compilación de Gradle de la aplicación y rodear su xml con la etiqueta de diseño, debe reconstruir su aplicación. Si eso no ayuda, elimine su carpeta de compilación y hágalo nuevamente.
fuente
Gracias a esta respuesta aquí , parece que el "espacio de nombres de diseño" debe borrarse o necesita un nuevo nombre único.
Estas son las opciones que funcionaron para mí:
Cree un nombre nuevo para el diseño para asegurarse de que se pueda generar. Esto resolvió mi problema, donde tenía un diseño que se creó por primera vez, sin enlace de datos , llamémoslo
fragment_abc.xml
. Cuando intenté agregarle enlace de datos, no se reconoció, incluso después de varias llamadas de reinicio y borrado de caché. Sin embargo, tan pronto como hice una copia del diseñofragment_abc2.xml
, inmediatamente obtuve el objeto .java / .class de enlace de datos generado.Después de ver el trabajo anterior, traté de eliminar la carpeta / build del módulo y reconstruí el proyecto; esto funcionó para obtener el enlace de datos para el diseño original.
fuente
Lo único que puedo imaginar si es posible es si no tienes
en su archivo gradle. Si no, agréguelo al archivo gradle. es decir
luego sincronice su proyecto. Si aún falla, es posible que deba invalidar / reiniciar su estudio de Android
fuente
<variable>
en xml está generando una clase de enlace, por lo que no hay caso de no agregardataBinding
un archivo gradle, si no lo he agregado, no debería generar una clase de enlace.No sé si te funcionará o no. Solo cambia el nombre el del archivo XML de diseño. Supongamos que el nombre de su diseño es activity_main.xml, simplemente cámbielo, cámbielo a algo como main.xml y vuelva a cambiarle el nombre a activity_main.xml . Entonces puede ver la opción de importación en ActivityMainBinding .
Espero que funcione para ti.
fuente
Cuando trabaje con una aplicación de Android de varios módulos, verifique su ruta de clases vinculante. Quizás deberías usar:
import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding
en lugar de:import com.yourcompany.app.android.databinding.FragmentABCtBinding
fuente
Elimine diseños y deshaga, y asegúrese de que las clases de enlace generadas se importen correctamente después de eso.
fuente
Tuve el mismo problema. Todo lo que hiciste correctamente. La cosa es que necesita agregar una variable dentro de la etiqueta de datos en xml. Para eso, debe crear una clase de modelo de muestra y agregarla como variable en la etiqueta de datos.
Hasta ese momento, no podrá ver ActivityMainBinding generado.
fuente
Tuve un problema similar en el que tenía el diseño envuelto y mi enlace de datos habilitado en el archivo gradle. La actividad principal todavía no podía intellisense ni ver mis clases. Lo que me solucionó fue agregar la variable de enlace e importar el enlace de todos modos. A partir de ahí, simplemente construí la solución y luego pareció saber cuál era la clase. Desde allí pude importar mis clases de casos de camello que se generaron.
fuente
Recibí el problema y el problema estaba en el diseño que el campo utilizado no era una Cadena, era una Fecha.
Parece que todo el campo tiene que ser texto para funcionar, al menos con el componente TexView.
Si compila con el comando ./gradlew build --stacktrace
Esto muestra mejor los errores.
fuente
En mi caso, pensé que la clase generada tenía que aparecer con mis clases habituales en la
src
carpeta. Además, pensé que el nombre de la clase generada debería ser ligeramente diferente. Todo fue mi error. La clase generada se puede encontrar en labuild
carpeta,build -> generated -> ...
ruta. Si no hay importación de la clase generada en su actividad, agregue la importaciónfuente
En caso de que obtenga el siguiente error en DataBindingUtil.setContentView
todo lo que necesita hacer es eliminar la siguiente declaración de importación
Encontré la solución en otro foro. Fuente
fuente
Si recientemente alguien migró un proyecto existente a androidx, entonces debe reemplazar su importación desde
a
Después de 2 días de Google, finalmente obtuve una solución, ¿cuál funciona para mí?
fuente
your.project.package.BR
). No dentro de una biblioteca de terceros comoandroidx.databinding.library.baseAdapters.BR
.Hay casos en los que no verá un archivo en el directorio generado, es posible que esté vinculando una propiedad que no está declarada en viewmodel. Básicamente, no le da un error de pelusa si lo hace en xml.
fuente
Si está implementando Serializable -> debe implementar el Serializable
de lo contrario, obtendrá este error. Espero que ayude a alguien en el futuro
En mi caso utilizo la biblioteca Parcel. Perdí anotar @Parcel en mi subclase
fuente
Además de los pasos anteriores, también puede verificar el tipo de variable. Asegúrese de que sea String para TextView o el mismo que se define en
BindingAdapter
. Por ejemplo:y en XML:
Esto provocará el error anterior. Para solucionarlo, puede hacer que la variable de edad sea de tipo String o puede importar String en su XML y usarlo de la
String.valueOf(age)
siguiente manera:Y en su TextView:
fuente
Mi solución fue tomar FragmentBinding como sufijo en el nombre de la clase.
La nomenclatura del nombre de la actividad o clase de fragmento puede variar en términos de prefijos. Porque el sufijo siempre es vinculante.
Después de seguir la respuesta de Khemraj e Invalidate Caches / Restart , debe reescribir ActivityBinding o FragmentBinding para obtener las sugerencias IDE de las clases que ya se generaron y NO codificar la importación.
En mi caso, estaba intentando importar el nombre de la clase al revés en
FragmentCompetitionsBinding
lugar deCompetitionsFragmentBinding
.GL
Fuente
fuente
En mi caso, las clases de enlace de datos no se generaron porque eliminé el directorio de recursos de Android mipmap. Recreé el directorio res / mipmap / y se restablecieron las clases de enlace de datos.
fuente
Encontré un problema similar en el que DataBinding no pudo generar la clase BindingImpl . En mi caso, fue un problema de un método en la clase de datos donde el nombre se usó incorrectamente: el modelo contenía un método onSignInCliked () y en el diseño que usé onSigninCliked () . Note la SignIn vs Signin .
El mensaje de error no fue suficiente y descubrí el problema solo cuando usé el script de compilación con la opción de seguimiento de pila.
fuente
Asegúrese de que el enlace de datos esté habilitado
dan clic en el botón (Sincronizar proyecto con Gradle)
fuente
Si hay un problema con su archivo XML, no se generará la clase Databinding . Una solución rápida sería ejecutar el archivo XML y comprobar si hay errores de sintaxis (que suelen estar resaltados en rojo). Los errores pueden venir en forma de referencias inexistentes o incorrectas, errores tipográficos, etc.
En esencia, asegúrese de que no haya una línea subrayada en rojo en su código XML. Cuando haya terminado, reconstruya y se habrá generado su clase de enlace de datos.
fuente
1.Añadir a continuación en la aplicación gradle
2.En el diseño xml, escriba el código a continuación
fuente
use la ruta de clase 'com.android.databinding: dataBinder: 1.0-rc0'
fuente