studio solucionar problemas libreria error con como clase arreglar android android-databinding

solucionar - problemas con la clase r android



Android: error de enlace de datos: no se puede encontrar la clase de símbolo (12)

Punto clave

Su nombre de diseño está en snake_case .

activity_login.xml

Entonces su nombre de clase de enlace estará en CamelCase .

ActivityLoginBinding.java

También construir proyecto después de crear diseño. A veces no se genera automáticamente.

Estoy empezando a utilizar la función de DataBinding . Estoy enfrentando un problema con eso.

Error: (21, 9) error: no se puede encontrar la clase de símbolo ContactListActivityBinding

build.gradle (Módulo: aplicación)

apply plugin: ''com.android.application'' android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.letsnurture.ln_202.databindingdemo" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(''proguard-android.txt''), ''proguard-rules.pro'' } } dataBinding { enabled = true } } dependencies { compile fileTree(dir: ''libs'', include: [''*.jar'']) testCompile ''junit:junit:4.12'' compile ''com.android.support:appcompat-v7:23.1.1'' compile ''com.android.support:design:23.1.1'' }

ContactListActivity.java

import android.databinding.DataBindingUtil; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.view.Menu; import android.view.MenuItem; import com.letsnurture.ln_202.databindingdemo.model.Contact; public class ContactListActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ContactListActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_contact_list); Contact user = new Contact("Chintan Soni", "+91 9876543210"); binding.setContact(user); // setContentView(R.layout.activity_contact_list); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_contact_list, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } }

content_contact_list.xml

<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.letsnurture.ln_202.databindingdemo.ContactListActivity" tools:showIn="@layout/activity_contact_list"> <data> <variable name="user" type="com.letsnurture.ln_202.databindingdemo.model.Contact" /> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="@dimen/activity_horizontal_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.contactName}" tools:text="Name" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.contactNumber}" tools:text="Number" /> </LinearLayout> </layout>

activity_contact_list.xml

<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="com.letsnurture.ln_202.databindingdemo.ContactListActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout> <include layout="@layout/content_contact_list" /> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" android:src="@android:drawable/ic_dialog_email" /> </android.support.design.widget.CoordinatorLayout>


A veces, la razón de estos errores no es el DataBinding sí, sino alguna otra parte de nuestro código. En mi caso, tuve un error en la base de datos de Room , por lo que el compilador no pudo generar las clases de enlace y me da estos errores.

Según Google :

Las versiones anteriores del compilador de enlace de datos generaron las clases de enlace en el mismo paso que compila su código administrado. Si su código administrado no se compila, es posible que obtenga varios errores que informen que no se encontraron las clases de enlace. El nuevo compilador de enlace de datos evita estos errores al generar las clases de enlace antes de que el compilador administrado genere su aplicación.

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

android.databinding.enableV2=true

También puede habilitar el nuevo compilador en su comando de gradle agregando el siguiente parámetro:

-Pandroid.databinding.enableV2=true

Tenga en cuenta que el nuevo compilador en Android Studio versión 3.2 está habilitado por defecto .


Asegúrese de que el nombre de su modelo y la referencia tengan el mismo nombre:

Por ejemplo, name = "item" debe coincidir con android: checked = "@ = { item .checked}"

<data> <variable name="item" type="com.simone.mywordlist.model.MyModel" /> </data> <Switch android:id="@+id/my_switch" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="@={item.checked}" />


Caí en este problema porque mi Actividad se llamó MainActivityMVVM y el Enlace se convirtió en MainActivityMvvmBinding en lugar de MainActivityMVVMBinding . Después de profundizar en las clases generadas encontré el problema.


Constantemente me encuentro con este problema. Creo que tiene que ver con que Android Studio no es consciente de los archivos generados dinámicamente. Si tiene todo lo correcto para el enlace de datos, intente Archivo> Invalidar cachés / Reiniciar ... y seleccione Invalidar cachés y Reiniciar. Luego intente e importe el archivo BR ... debería importar bien.

Es posible que tenga que lanzar en un Limpiar y Reconstruir.


Debe cambiar su activity_contact_list para ser enlazado - agregue la etiqueta de diseño como lo hizo en content_contact_list . No se olvide, el diseño raíz dentro de activity_contact_list debe tener un ID para que se genere la clase Binding y se llamará ActivityContactListBinding (es decir, el nombre del diseño con lanzamiento de camello en lugar de guiones bajos).

A continuación, dentro de activity_contact_list , proporcione <include layout="@layout/content_contact_list" /> una identificación, luego tendrá acceso para su instancia de enlace a través de su instancia ActivityContactListBinding.

Algo como:

binding.contentContactList.setContact(user);

Déjame saber si funciona.


Debe declarar y pasar el enlace en el diseño de la actividad, no en el diseño incluido.

Ejemplo de la documentación :

<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bind="http://schemas.android.com/apk/res-auto"> <data> <variable name="user" type="com.example.User"/> </data> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <include layout="@layout/name" bind:user="@{user}"/> <include layout="@layout/contact" bind:user="@{user}"/> </LinearLayout> </layout>

Aquí, debe haber una variable de usuario en los archivos de diseño name.xml y contact.xml.


En mi caso, había un paquete con el mismo nombre que una importación faltante en la clase de vinculación de datos generada ... Parece que el compilador se confundió.


Por favor, consulte la guía del desarrollador de Android

El archivo de diseño era main_activity.xml, por lo que la clase de generación era MainActivityBinding

Ya que su xml se llama "activity_contact_list.xml", debe usar ActivityContactListBinding en lugar del original


Tengo el mismo error, pero con el uso de Kotlin.

Para resolverlo, hago algunos cambios en los archivos de gradles:

En el archivo Gradle del proyecto :

dependencies { classpath "com.android.tools.build:gradle:3.1.2" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.40" }

En el archivo Gradle de la aplicación:

dependencies { ... implementation "android.arch.lifecycle:extensions:1.1.1" compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.30" kapt ''com.android.databinding:compiler:3.1.2'' } kapt { generateStubs = true } //used to resolve annotation conflicts configurations.all { resolutionStrategy { force ''com.android.support:support-annotations:23.1.1'' } }


este es tu código

ContactListActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_contact_list);

Reemplace este código

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_contact_list);


Esta respuesta le ayudará a generar la clase de enlace de datos y también a generar variables de diseño en la clase de enlace de datos.

5 consejos que utilizo para resolver problemas vinculantes.

Suponiendo que ha habilitado el enlace de datos en build.gradle y que ha convertido su diseño en un diseño de enlace .

En primer lugar, toda clase de enlaces se genera automáticamente cuando convierte el diseño en un diseño de enlaces. Todavía a veces no se genera cuando los subprocesos de fondo no funcionan. Aquí hay algunos consejos para que usted resuelva esto.

(1)

El nombre del diseño está en caso de serpiente activity_main.xml

La clase de enlace de datos será en el caso de camellos como ActivityMainBinding .

(2). Escriba el nombre completo de la clase de enlace

Sentí que a veces cuando escribes ActivityMai... , entonces no muestra sugerencias , pero eso no significa que no se genere clase. En ese caso, debe escribir el nombre completo de la clase generada esperada. Como el tipo ActivityMainBinding y se mostrará la ventana emergente de importación . (Eso es lo que me enfrenté muchas veces.)

(3). Proyecto de reconstrucción

Si todavía no se genera su clase. (En algún momento cuando pegamos el archivo de diseño, entonces sucede) . Luego reconstruir el proyecto desde la Build> Rebuild ( no compilar o crear proyecto ) Se generará su clase de enlace de datos. ( Reconstruir hace magia para mí todo el tiempo. )

(4) Si ha creado una <variable en su diseño y no se muestra su configurador y captador en la clase de enlace de datos, siga en el cuarto punto .

(5) Aún si su clase no está generando, entonces debe verificar si la compilación no está fallando debido a un error en su archivo de diseño. La clase de enlace de datos se generará con una construcción exitosa.

Esto es todo lo que hago para resolver mis errores de enlace de datos. Si tienes algún problema adicional, puedes comentar aquí.

Fuente de respuesta