android - resueltos - tipos de enlaces covalentes
No se puede resolver la clase de enlace de datos de Android (16)
La clase de vinculación se generará en función de su nombre de archivo de diseño. De forma predeterminada, el nombre de la clase se basa en el nombre del archivo de diseño, convirtiéndolo en el caso de Pascal y agregándole el sufijo de enlace
por ejemplo, si su nombre xml es activity_main.xml, entonces el nombre de la clase DataBinding será ActivityMainBinding
luego importa el paquete:
<data class="ContactItem">
...
</data>
entonces puedes usarlo
<data class=".ContactItem">
...
</data>
Al utilizar el enlace de datos, no puedo obtener la clase MainActivityBinding
según la Guía de enlace de datos
Mi nombre de diseño es activity_main.xml
. También veo Android - Enlace de datos - ¿Cómo y cuándo se generarán las clases de enlace? pero no puede ayudarme.
Compruebe que su xml y clase de actividad / fragmento tienen nombres consistentes; por ejemplo, si tiene TimePickerFragment
el nombre del archivo xml debería ser time_picker_fragment
.
Se me ocurrió que tenía el diseño llamado fragment_time_picker
; Después de cambiarlo se generó el enlace.
De forma predeterminada, una clase de enlace se genera en función del nombre del archivo de diseño, iniciándolo con mayúsculas, eliminando los guiones bajos (_) y usando mayúsculas en la siguiente letra y luego con el sufijo "Enlace".
Esta clase se colocará en un paquete de enlace de datos bajo el paquete del módulo.
Por ejemplo, el archivo de diseño contact_item.xml
generará ContactItemBinding
.
Si el paquete del módulo es com.example.my.app
, se colocará en com.example.my.app.databinding
.
Las clases de vinculación pueden ser renombradas o colocadas en diferentes paquetes ajustando el atributo de clase del elemento de datos. Por ejemplo:
<data class="com.example.ContactItem">
...
</data>
Esto genera la clase de enlace como ContactItem
en el paquete de enlace de datos en el paquete del módulo. Si la clase debe generarse en un paquete diferente dentro del paquete del módulo, puede tener el prefijo “.”
:
MainActivity.java
public class MainActivity extends AppCompatActivity {
public Item item;
ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
item = new Item();
item.setChecked(true);
item.setName("a");
binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
binding.included.secondIncluded.setModel(item);
Item.java
public class Item extends BaseObservable {
private String name;
private Boolean checked;
@Bindable
public String getName() {
return this.name;
}
@Bindable
public Boolean getChecked() {
return this.checked;
}
public void setName(String name) {
this.name = name;
notifyPropertyChanged(BR.name);
}
public void setChecked(Boolean checked) {
this.checked = checked;
notifyPropertyChanged(BR.checked);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="abc"
android:textSize="20sp" />
<include
android:id="@+id/included"
layout="@layout/included_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
included_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="123"
android:textSize="20sp" />
<include
android:id="@+id/second_included"
layout="@layout/second_included_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
second_included_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="model"
type="com.example.simone.twowaydatabinding.Item" />
</data>
<LinearLayout
android:id="@+id/linear_layout_included"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="xyz"
android:textSize="20sp" />
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@={model.name}"
android:textSize="20sp" />
<Switch
android:id="@+id/switch_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="@={model.checked}" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="change"
android:onClick="button_onClick"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/world"/>
</LinearLayout>
</layout>
En este caso, ContactItem
se genera directamente en el paquete del módulo. Se puede usar cualquier paquete si se proporciona el paquete completo:
1) Rebuild the project after adding the dataBinding in gradle.
2) Rebuild after adding layout tag in xml.
3) cleaning the project
4) rebuilding the project
5) Restarted the Android Studio
En mi caso, BORRAR la carpeta de compilación de la aplicación y luego reconstruir el proyecto resolvió mi problema.
Incluso los siguientes pasos no funcionaron.
import com.domain.my.databinding.MyActivityBinding;
Después de habilitar el enlace de datos en el archivo gradle de la aplicación, reconstrúyalo. Entonces podemos encontrar la clase de vinculación generada.
If the layout name is fragment_home, The Binding class name will be FragmentHomeBinding.
En tales casos, si ni la reconstrucción ni la invalidación funcionan, entonces debe haber un error en uno de sus archivos xml donde puede haber usado @ {xyz.abc} y debe haber un problema con xyz o abc en el xml.
Gracias a todos por su respuesta. Encontré una solución con ContentMainBinding
nombre de clase para enlace de datos. Me deja explicar
NOTA: Mientras se usa layout con <include ...
aquí está <include layout="@layout/content_main"
con funcionalidad de enlace de datos, el nombre de la clase relacionada con el nombre de layout. Aquí está el ContentMainBinding
Mi archivo de diseño son los siguientes:
activity_main.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.databindingdemo.app.MainActivity">
...
<include layout="@layout/content_main" />
...
</android.support.design.widget.CoordinatorLayout>
Y content_main.xml es el diseño donde agregué mi código de diseño de enlace de datos.
Entonces, en lugar de usar MainActivityBinding
se puede resolver con ContentMainBinding
El código que me funciona a continuación es:
//Code for data binding
ContentMainBinding contentMainBinding = DataBindingUtil.setContentView(this, R.layout.content_main);
user = new User("Pranay", "Patel", "[email protected]", "9999999999");
contentMainBinding.setUser(user);
HECHO.
He intentado las siguientes soluciones que no funcionaron para mí: 1) Invalidar el caché y reiniciar. 2) Reinicie Android Studio. 3) Reconstruir proyecto.
Lo que DID solucionó el problema es: 1. Eliminar la etiqueta "dataBinding" en el módulo gradle.build 2. Proyecto Sync 3 Devolver la etiqueta "databinding" 4. Volver a sincronizar el proyecto.
He limpiado el proyecto, Rebuild se hizo ... pero fue inútil. Luego invalidé los cachés y reinicié el proyecto que tampoco me ayudó.
Luego cambié mi nombre de archivo xml, que funcionó fantásticamente bien.
Por lo tanto, me gustaría compartir una cosa, cambie el nombre de archivo xml.
Por ejemplo: si su archivo xml es: activity_main.xml y no puede obtener ActivityMainBinding en su clase Java .......... luego cambie el nombre xml a main_activity.xml y luego use MainActivityBinding en su clase java como ''Enlace MainActivityBinding privado''
Esto lo hará muy probablemente.
Intente reiniciar Android Studio o busque manualmente la clase ActivityMainBinding y agregue su importación.
Ponga su etiqueta de datos en su último xml incluido. Aquí hay un ejemplo:
If the layout name is fragment_home, The Binding class name will be FragmentHomeBinding.
La clase de DataBinding se generará en base a su nombre de archivo xml. Está claramente mencionado en el documento que está siguiendo.
De forma predeterminada, una clase de enlace se generará en función del nombre del archivo de diseño, convirtiéndolo en el caso de Pascal y con el sufijo "Enlace" en él. El archivo de diseño anterior era main_activity.xml, por lo que la clase de generación era MainActivityBinding
Si su nombre xml es activity_main.xml
, entonces el nombre de la clase DataBinding será ActivityMainBinding
.
Si su nombre xml es main_activity.xml
, entonces el nombre de la clase DataBinding será MainActivityBinding
.
No te olvides de limpiar y construir el proyecto una vez.
Puedes seguir este tutorial para más información sobre DataBinding
No obtuve ninguna respuesta satisfactoria. Así que aquí están los consejos que son un resumen de mi conocimiento de enlace de datos.
Consejos para disminuir el tiempo atascado en DataBinding.
Esta respuesta le ayudará a generar una clase de enlace de datos y también a generar variables de diseño en la clase de enlace de datos.
Punto 3-último son muy importantes, así que no te los pierdas.
1. Compruebe si el enlace de datos habilitado
Debe tener el enlace de datos habilitado en build.gradle
. Si no es así, agregue esto y sincronice .
import com.companyname.applicationname.databinding.ActivityMainBinding;
2. Comprobar que el diseño se convierte en diseño de enlace
Ahora, si desea que se genere la clase de enlace de datos, entonces debe envolver el xml layout
con el enlace de datos ( <layout
etiqueta de <layout
). Algo como esto.
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
User user = new User("Test", "User");
binding.setUser(user);
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 su diseño está en snake case
activity_main.xml
, la clase de enlace de datos se generará en un caso de camello comoActivityMainBinding
.
A veces, cuando escribe
ActivityMai...
, entonces no muestra la sugerencia , en ese caso, importe la clase manualmente.android { ... dataBinding { enabled = true } ... }
4. Revise los diseños para los errores
Su clase de enlace y nuevas variables en el diseño, no se generarán si su compilación falla. Así que haz un proyecto con Ctrl + F9 (Build> Make project) .
- Si la compilación falla, vea qué es el 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 la causa.
5. Cerrar y abrir proyecto de reciente
Siempre hago esto porque lleva mucho menos tiempo que el proyecto Rebuild
/ Make
.
- Cerrar proyecto desde Archivo> Cerrar proyecto
- Abrir de nuevo desde reciente
Tenga en cuenta que prefiero Cerrar y Abrir desde Reciente porque toma mucho menos tiempo que Reconstruir / Reiniciar IDE .
6. 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 Reconstruya el Proyecto desde Build> Rebuild
( No Construir o Crear proyecto ). Se generará su clase de enlace de datos. ( Reconstruir hace magia para mí. )
7. Tener el último estudio de Android
Después de actualizar AS a Android Studio 3.2 , sentí muchos errores en la generación automática de enlace de datos. Así que también deberías tener el último AS.
Solución para <variables
<?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>
Por lo general, cuando ponemos una variable en el diseño, crea getter y setter. Y podemos usar binding.setItem(item);
y binding.getItem();
, pero si no puede ver los métodos, lea la información a continuación.
1. Cerrar y abrir proyecto de reciente
Si ha creado una <variable
en su diseño y no se muestra su configurador y captador en la clase de enlace de datos, intente cerrar el proyecto y abrir desde el reciente.
2. Limpie el proyecto después de cambiar el tipo
Si cambió el tipo de alguna <variable
en su diseño y el tipo de configurador de obtención no cambia, entonces Limpie el proyecto ( Build> Clean Project
)
Ultimas palabras
Finalmente, si todavía no se genera tu clase de enlace, entonces tenemos nuestra arma más poderosa. - Reiniciar Android Studio: D
- Primero intente simplemente reiniciar , esto siempre genera variables de mi diseño de enlace después de reiniciar.
- Si no funciona, invalide caché y reinicie .
Esto es todo lo que hago para resolver mis errores de enlace de datos. Si tienes algún problema adicional, puedes comentar aquí.
comprueba esta respuesta también
No puedo comentar así que solo añadiré esto en respuesta. Creo que activity_main.xml creará ActivityMainBinding en lugar de MainActivityBinding como usted mencionó. en algunos casos donde studio no puede encontrar la clase de enlace, simplemente invalide los cachés y reconstruya el proyecto.
Reinicie Android studio o intente cambiar el nombre del archivo XML por otro nombre y verifique si el enlace funciona una vez que funciona.
Si el nombre de la clase DataBinding es correcto y solía limpiar y reconstruir el proyecto, pero sigue mostrando un error.
A continuación, intenta reiniciar AndroidStudio
Tuve el mismo problema después de cambiar el nombre del paquete de mi fuente, después de probar muchas cosas (incluidas las que se mencionan aquí), resolví el problema importando la clase de enlace de datos manualmente:
import com.domain.my.databinding.MyActivityBinding;
INTENTE Renombrar el archivo xml con otro nombre y verificar si el enlace funciona una vez que funciona, renómbrelo como el que se usó.
Eso ayudó a Android Studio 3.1