ガイドにあるデータバインディングをテストしようとしています here 。私はこれを(モジュールアプリの)私のbuild.gradleファイルに含めました:
compileSdkVersion 'Android-MNC'
buildToolsVersion '23.0.0 rc2'
プロジェクトbuild.gradleファイルで、これを依存関係に含めました。
classpath "com.Android.tools.build:gradle:1.3.0-beta2"
classpath "com.Android.databinding:dataBinder:1.0-rc0"
レイアウトファイルは、ガイドに記載されているものとまったく同じです。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@{user.firstName}"/>
<TextView Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@{user.lastName}"/>
</LinearLayout>
</layout>
最初はエラーが発生しましたElement layout does not have the required attribute layout_width and layout_height
。
Match_parentを両方に割り当てて修正しようとしました。その後、エラーが発生しましたError parsing XML: duplicate attribute
を割り当てた行でlayout_height
およびlayout_width
線形レイアウト。
繰り返しますが、これらの属性を削除してこれを修正しようとしました。今、私はコンパイルしようとするたびに、私はこれを見る-error: package my.package.name.databinding
存在しない。
このレイアウトを使用しようとしているフラグメントでは、コード補完が完全に機能しています。
それで私は何を見逃しましたか?
削除apply plugin: 'com.neenbedankt.Android-apt'
私のbuild.gradleが私の問題を解決しました。
Xmlファイルのバインディングが無効である可能性があります。
必ず再確認してください
type
属性はデータオブジェクトへの有効な参照ですか? type="my.package.Class"
name="client"
-> "@{client.field}"
public
またはゲッターでカプセル化OldNameBinding -> NewNameBinding
通常は、XMLレイアウトファイルにエラーがあり、バインディングオブジェクトを生成できないためです。データ型を正しく記述していることを確認し、記述の下部または上部を確認してください。
<data>
<variable name="yourObject" type="com.example.simple.YourObject"/>
</data>
そして、オブジェクトが正しい呼び出しであることを確認してください:
<TextView Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@{yourObject.name}"/>
<TextView
これはAndroid studio。
私は同じ問題を抱えていたので、このサンプルリポジトリをクローンして、システムがデータバインディングAPIをサポートするように正しく構成されていることをテストしました https://github.com/mgrzechocinski/Android-bindings-example
layout
タグのエラー警告を無視します。違います。
気づいたのは、生成されたBindingActivityクラスを介してデータバインディングを使用してビューアイテムにアクセスする場合は、data
タグを必ずしも必要としないことです。
ダガーまたは他のライブラリに「Android-apt」プラグインを使用している場合、データバインディングを有効にした後、依存関係で「Android-apt」プラグインを削除し、「apt」ではなく「provided」を使用する必要があります。たとえば、短剣を使用している場合は、これを削除します
classpath 'com.neenbedankt.gradle.plugins:Android-apt:1.4'
この
apply plugin: 'com.neenbedankt.Android-apt'
そして次に交換
apt 'com.google.dagger:dagger-compiler:2.0'
と
provided 'com.google.dagger:dagger-compiler:2.0'
ガイドの 現在のバージョン (2015-11-11)によると、2つの依存関係を追加する必要があります。プロジェクトのbuild.gradleファイルにgradle依存関係を追加します。現在、最新の version は1.5.0-beta3です
dependencies {
classpath 'com.Android.tools.build:gradle:1.5.0-beta3'
}
そして、モジュールのbuild.gradleファイルにdataBindingセクションを含めます:
Android{
...
dataBinding {
enabled = true
}
...
}
エラー
エラー:パッケージmy.package.name.databindingは存在しません
xmlとPOJOクラスの不一致が原因で発生する可能性があります
ゲッターセッターを作成しない場合は、POJOクラスのデータメンバーがpublic
になるように非常に注意する必要があります。
ゲッターまたはセッターのない単純なPOJOがある場合
public class User {
public final String firstName;
public final String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
ゲッターセッター、javaBeanスタイルクラスを作成する場合
public class User {
private final String firstName;
private final String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return this.firstName;
}
public String getLastName() {
return this.lastName;
}
}
モデルとレイアウトファイルの間に問題または不一致がある可能性があります。私の場合、私は持っていました:
...
<TextView
Android:layout_alignParentLeft="true"
Android:layout_alignParentStart="true"
Android:layout_toLeftOf="@+id/photo"
Android:layout_toStartOf="@+id/photo"
tools:text="0912454433"
Android:textStyle="bold"
Android:text="@{contact.cellPhoneNumber}"
Android:layout_below="@+id/name"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
しかし、私のモデルクラスは次のようでした:
public class MyContact {
public String name;
public String cellphoneNumber; // <-- Notice the lowercase 'p'
}
私の場合、問題はlayout_height
とlayout_width
をlayout
タグとルートレイアウトに追加していたことです。 layout
タグから両方の属性を削除し、問題を解決しました。
//これはactivity_main xmlの下にあります。
<data>
<variable
name="student"
type="com.example.vishalkamboj.testdatabinding.Student" />
</data>
//これは学生クラスです
public class Student {
public String firstname; public String lastname;
public Student(String firstname , String lastname)
{
this.firstname = firstname;
this.lastname = lastname;
}
}