Clase de enlace de datos no generada

97

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 ActivityMainBindingen 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 ActivityMainBindingclases.

Android Studio: 2.1.3
Classpath: com.android.tools.build:gradle:2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0

Ravi
fuente
2
está dataBinding.enableden tu build.gradle?
pskink
2
Creo que este es un error conocido. Puede intentar construir su proyecto antes de intentar acceder ActivityMainBinding, o tiene que hacer algo con este error.
yennsarah
@pskink, sí, es por eso que está generando una clase de enlace después de agregar <variable>en xml
Ravi
@Amylinn después de construir mi proyecto genera, pero mi pregunta es cuando escribo <variable>, genera una clase vinculante sin proyecto de construcción.
Ravi
ah, de hecho, me perdí eso
pskink

Respuestas:

216

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

Después de leer esta respuesta, no se quedará atascado en problemas de generación automática de enlaces de datos para clases y variables de datos .

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 .

android {
...
   dataBinding {
        enabled = true
    }
...
}

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 layoutcon el enlace de datos ( <layoutetiqueta). Algo como esto.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </android.support.constraint.ConstraintLayout>
</layout>

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.

Si el nombre de la presentación es en el caso de la serpiente activity_main.xml entonces la clase de enlace de datos se genera en caso de camellos como ActivityMainBinding.

4. ¿No puede ver la sugerencia de importación?

A veces, cuando escribe ActivityMai..., no muestra la sugerencia , en ese caso, importe manualmente .

import <yourpackage>databinding.ActivityMainBinding;

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) .

  • Si una compilación falla, vea qué es un error, generalmente tenemos errores en los campos de diseño. Los registros de errores señalarán el número de línea de error con el problema.
  • El enlace puede fallar y causar algún error estúpido , como un error de sintaxis o una importación faltante. En ese caso, obtendrá logcat lleno de errores de clases vinculantes. Pero debe leer logcat completo para encontrar el problema apropiado .

6. Cierre y abra el proyecto de reciente

Siempre hago esto porque lleva mucho menos tiempo que Rebuild/ Makeproject.

  • Cerrar proyecto desde Archivo> Cerrar proyecto
  • Abrir de nuevo desde reciente

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

<data>
    <variable
        name="item"
        type="com.package.Model"/>
</data>

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);y binding.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, <variableen 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 <variableen 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

  • Primero, intente reiniciar , esto siempre genera variables de mi diseño de enlace después del reinicio.
  • Si no funciona, invalide la caché y reinicie .

Esto es todo lo que hago para resolver mis errores de vinculación de datos. Si tiene más problemas, puede comentar aquí.

Khemraj
fuente
2
Si el problema continúa ... (8) Invalidar y reiniciar .... si no se resuelve, (9) cambiar dataBinding {enabled = false} ... build, y luego dataBinding {enabled = true} build de nuevo ....
PravyNandas
1
En mi caso, tuve que importar la ruta de clases manualmente por alguna razón, el IDE no muestra esto como una solución. Tnx :)
Ivan Kaloyanov
2
Salvó mi día. Me faltaba el envoltorio <layout> en mi archivo de diseño. ¡Gracias!
Juliano
También puede agregar que debe eliminarse "import android.R", si es parte de la lista de importación. Esto resolvió mi problema con la referencia no resuelta al archivo xml de actividad
Tim John
23

Clase DataBinding generada automáticamente.

si su nombre xml es activity_test, la clase Binding será ActivityTestBinding.

pero,

dataBinding {
        enabled = true
    }

el diseño debe tener el diseño como raíz

<layout xmlns:android="http://schemas.android.com/apk/res/android">
</layout>
ViramP
fuente
Estoy buscando soultion durante horas, hago mucha magia gradle, pero la uso ConstraintLayoutcomo raíz. ¡Gracias!
Alexey Markov
14

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í.

    <?xml version="1.0" encoding="utf-8"?>
    <layout>
        <data>  </data>
        <RelativeLayout
           xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="match_parent"
           android:layout_height="match_parent">
        </RelativeLayout>
    </layout> 
ngaspama
fuente
10

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 :)

Krzysztof Kubicki
fuente
2
Bingo, funcionó para mí, aunque tuve que escribir la importación manualmente, intellisense no ofrecía la opción por alguna razón.
Rob
8

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.

Motociclista xtreme
fuente
Esto debe marcarse como la respuesta correcta. Descansar, todos son solo soluciones. No es necesario mover espacios de nombres o incluso agregar elementos de datos
Vicky Kapadia
8

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. ingrese la descripción de la imagen aquí

Mahdi Azadbar
fuente
4
dataBinding {
        enabled = true
    }

Para habilitar el nuevo compilador de enlace de datos, agregue la siguiente opción a su archivo gradle.properties:

android.databinding.enableV2=true
Samir Mangroliya
fuente
3

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.

Schadenfreude
fuente
2

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í:

  1. 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ño fragment_abc2.xml, inmediatamente obtuve el objeto .java / .class de enlace de datos generado.

  2. 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.

Gene Bo
fuente
1

Lo único que puedo imaginar si es posible es si no tienes

dataBinding {
    enabled true
}

en su archivo gradle. Si no, agréguelo al archivo gradle. es decir

android {
  ......

  dataBinding {
    enabled true
  }
}

luego sincronice su proyecto. Si aún falla, es posible que deba invalidar / reiniciar su estudio de Android

Hassan Semiu Ayomon
fuente
He mencionado claramente en mi pregunta que después de agregar <variable>en xml está generando una clase de enlace, por lo que no hay caso de no agregar dataBindingun archivo gradle, si no lo he agregado, no debería generar una clase de enlace.
Ravi
Antes de sincronizar y reiniciar. Intente "Hacer". Funcionará.
Nizamudeen Sherif
1

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.

Sudhansu
fuente
1

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

kosiara - Bartosz Kosarzycki
fuente
1

Elimine diseños y deshaga, y asegúrese de que las clases de enlace generadas se importen correctamente después de eso.

Ahmed AlAskalany
fuente
0

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.

Srinivasan
fuente
0

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.

stegnerd
fuente
0

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.

jactive
fuente
0

En mi caso, pensé que la clase generada tenía que aparecer con mis clases habituales en la srccarpeta. 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 la buildcarpeta, build -> generated -> ...ruta. Si no hay importación de la clase generada en su actividad, agregue la importación

import com.yourcompany.app.databinding.ActivityMainBinding;"
Kseniya
fuente
0

En caso de que obtenga el siguiente error en DataBindingUtil.setContentView

Referencia sin resolver: activity_main

todo lo que necesita hacer es eliminar la siguiente declaración de importación

importar android.R

Encontré la solución en otro foro. Fuente

Tim John
fuente
0

Si recientemente alguien migró un proyecto existente a androidx, entonces debe reemplazar su importación desde

import com.yourpackagename.BR;

a

import androidx.databinding.library.baseAdapters.BR;

Después de 2 días de Google, finalmente obtuve una solución, ¿cuál funciona para mí?

Milán Sheth
fuente
1
No. Recurso vinculante ( .BR. ) Como Recurso ( .R. ). Se generó en función del recurso de su proyecto (id, dibujable, color, ...) por lo que se colocará dentro de su paquete de proyecto ( your.project.package.BR). No dentro de una biblioteca de terceros como androidx.databinding.library.baseAdapters.BR.
dphans
0

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.

Uzair
fuente
0

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

Ranjith Kumar
fuente
0

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:

data class MyDataObject(val name: String, val age: Int)

y en XML:

android:text="@{dataobject.age}"

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:

<data>
    <import type="String" />
...
</data>

Y en su TextView:

android:text="@{String.valueOf(dataobject.age)}"
shyam
fuente
0

Mi solución fue tomar FragmentBinding como sufijo en el nombre de la clase.

Se genera una clase de enlace para cada archivo de diseño. Por defecto, el nombre de la clase se basa en el nombre del archivo de diseño, convirtiéndolo al caso Pascal y agregando el sufijo Binding. El nombre de archivo de diseño anterior es activity_main.xml, por lo que la clase generada correspondiente es ActivityMainBinding. Esta clase contiene todos los enlaces desde las propiedades del diseño (por ejemplo, la variable de usuario) hasta las vistas del diseño y sabe cómo asignar valores para las expresiones de enlace.

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 FragmentCompetitionsBindinglugar de CompetitionsFragmentBinding.

GL

Fuente

Coronel braian
fuente
0

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.

con errores
fuente
0

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.

Ionut Negru
fuente
0

Asegúrese de que el enlace de datos esté habilitado

android {
...
   dataBinding {
        enabled = true
    }
...
}

Sincronizar proyecto con gradle dan clic en el botón (Sincronizar proyecto con Gradle)

fahrizal89
fuente
0

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.

Taslim Oseni
fuente
-1

1.Añadir a continuación en la aplicación gradle

 dataBinding {
        enabled = true
    }

2.En el diseño xml, escriba el código a continuación

<layout
    xmlns:android="http://schemas.android.com/apk/res/android">
  <data></data>
</layout>if you don't get data binding class just rename the layout file name and you will get data binding class.
Rohan Lodhi
fuente
3
¿Por qué dataBinding requeriría permiso de Internet, en un caso general?
M.Pomeroy
1
@ M.Pomeroy sí, no es obligatorio, no se editó la respuesta gracias
Rohan Lodhi
-5

use la ruta de clase 'com.android.databinding: dataBinder: 1.0-rc0'

Sumanta Banerjee
fuente
para gradle 1.5.0 y superior, no es necesario utilizar esta ruta de clases.
Ravi