Je reçois le message d'erreur suivant lorsque j'essaie d'exécuter mon application:
Error:Execution failed for task ':app:compileDevelopmentDebugJavaWithJavac'.
> Java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:Could not find accessor Java.lang.String.giftRecipientName redacted.xml loc:182:63 - 182:93 ****\ data binding error ****
J'ai un objet Order qui ressemble à ceci:
public class Order {
public Address address;
// unrelated fields and methods
}
L'objet d'adresse imbriqué ressemble à ceci:
public class Address {
public String addressLine1;
public String addressLine2;
public String giftRecipientName;
public Boolean isGift;
}
Dans mon .xml je fais ce qui suit:
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
<data>
<variable name="order" type="example.redacted.models.Order"/>
</data>
// widgets and whatnot
<TextView
Android:id="@+id/gift_recipientTV"
Android:layout_column="1"
Android:layout_weight="1"
Android:layout_width="0dp"
Android:textStyle="bold"
Android:gravity="right"
Android:text='@{order.address.isGift ? order.address.giftRecipientName : "" }'/>
Enfin dans mon fragment:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
RedactedBinding dataBinding = DataBindingUtil.inflate(inflater, R.layout.redacted, container, false);
dataBinding.setOrder(_order);
return dataBinding.getRoot();
}
Après des heures d’essais et d’erreurs, il semble que la liaison de données Android cherche des getters avant des champs publics. Mon objet Order avait une méthode d'assistance appelée getAddress.
public class Order {
public Address address;
public String getAddress() {
return address.addressLine1 + address.addressLine2;
}
}
Le classeur appelait cette méthode au lieu d'accéder au champ d'adresse public. Je mets la méthode getAddress dans l'objet Address (où il aurait probablement dû commencer) et l'application compilée.
Dans mon cas, Ma ViewModel
a un nom de variable commençant par m et cela créait un problème
public class MyViewModel extends ViewModel {
private LiveData<SomeClass> mTask; //Chaning the variable name to task and it's getter name to getTask worked for me
//...code left for brevity
public LiveData<SomeClass> getmTask() {
return mTask;
}
}
J'ai changé le nom de la variable mTask
en task
et son nom getter getmTask
en getTask
et cela a fonctionné pour moi.
public class MyViewModel extends ViewModel {
private LiveData<SomeClass> task;
//...code left for brevity
public LiveData<SomeClass> getTask() {
return task;
}
}
Et dans mon fichier xml, j'ai pu y accéder
<TextView
...
Android:text="@{viewmodel.task.title}"
Erreur Android DataBinding. Impossible de trouver l'accesseur
accessor
ou getter
pour fonctionner, ainsi que setter
si vous utilisez une liaison bidirectionnelle.getter
& setter
dans votre classe de modèle.Vérifiez votre fichier Layout et votre classe ViewModel. Un nom de variable doit être identique dans les deux fichiers.
Dans la classe ViewModel:
MutableLiveData<String> emailId = new MutableLiveData<>();
Dans les fichiers de mise en page:
<EditText
........
Android:text="@={loginVM.emailId}"
Dans mon cas, j'accédais à la propriété d'un objet kotlin à partir de xml:
object CurrentUser {
// ...
var userTeams: Map<String, String> = //...
// ...
}
<Button
Android:text="@{CurrentUser.userTeams.get("id")}" />
mais comme la liaison de données utilise Java, il ne peut pas accéder directement à un objet Kotlin. Je l'ai donc modifié en:
<Button
Android:text="@{CurrentUser.INSTANCE.userTeams.get("id")}" />
Et il fonctionne!