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