30

アプリを実行しようとすると、次のエラーが発生します。

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 ****

次のような Order オブジェクトがあります。

public class Order {
    public Address address;
    // unrelated fields and methods
}

ネストされた Address オブジェクトは次のようになります。

public class Address {
    public String addressLine1;
    public String addressLine2;
    public String giftRecipientName;
    public Boolean isGift;
}

私の .xml では、次のことを行っています。

<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 : "" }'/>

最後に私のフラグメントで:

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

10 に答える 10

35

何時間もの試行錯誤の後、Android のデータ バインディングはpublic フィールドを見る前に getter を探すようです。Order オブジェクトに getAddress というヘルパー メソッドがありました

public class Order {
    public Address address;

    public String getAddress() {
        return address.addressLine1 + address.addressLine2;
    }
}

バインダーは、パブリック アドレス フィールドにアクセスする代わりに、そのメソッドを呼び出していました。getAddress メソッドを Address オブジェクト (最初に配置する必要があったはずの場所) 内に配置し、アプリをコンパイルしました。

于 2015-09-20T19:04:46.593 に答える