web-dev-qa-db-fra.com

Erreur Android DataBinding. Impossible de trouver l'accesseur

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();
}
13
MidasLefko

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.

18
MidasLefko

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}"
2
L-X

Erreur Android DataBinding. Impossible de trouver l'accesseur

  • Comme cette erreur l'indique, la liaison doit utiliser accessor ou getter pour fonctionner, ainsi que setter si vous utilisez une liaison bidirectionnelle.
  • Donc, mettez toujours getter & setter dans votre classe de modèle.
1
Khemraj

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}"
1
rahul

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!

1
aksh1618