データバインディングクラスは生成されません


96

プロジェクトでデータバインディングを使用<layout>しています<data>が、XMLバインディングクラスを使用すると、生成されません。

たとえば、私はactivity_main.xmlを持っています

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>    </data>
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </RelativeLayout>
</layout>

今私がActivityMainBinding私のアクティビティ/フラグメントを書いている場合、クラスが利用できないというエラーが表示されます。しかし<variable>、私のxmlファイルに含めた後、ActivityMainBindingクラスを生成することができます。

Android Studio:2.1.3
クラスパス:com.android.tools.build : gradle : 2.1.3
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.0


2
であるdataBinding.enabledあなたのbuild.gradleに?
pskink

2
これは既知のエラーだと思います。にアクセスする前にプロジェクトをビルドするActivityMainBindingか、このバグで何かをする必要があります。
エインサラ2016

@pskinkはい、そうです。それが<variable>xml に追加した後にバインディングクラスを生成する理由です
Ravi

@Amylinnが生成したプロジェクトをビルドした後、私の質問は、<variable>プロジェクトをビルドせずにバインディングクラスを生成することです。
Ravi

ああ、確かに、私はそれを逃した
pskink

回答:


214

満足のいく答えは得られませんでした。だからここに私のデータバインディングの知識の要約であるヒントがあります。

データバインドの問題を解決するためのヒント

更新

より正確なエラー提案を取得するには、Android StudioとGradleプラグインのバージョンを最新に更新することを強くお勧めします。AS 3.2バージョン以降、多くの問題に直面していないためです。

最新のAndroid Studio最新のGradleプラグインをご覧ください。

元のソリューション

この答えを読んだ後、あなたは動けなくなることはありませんは、クラスとデータ変数の両方でデータバインディングの自動生成の問題発生。

これらのポイントを1つずつ確認してください。これらのどれでもあなたの仕事を終わらせることができます。最後にポイント3は本当に重要なので、それらをお見逃しなく。

1.データバインディングが有効かどうかを確認する

データバインディングを有効にする必要がありますbuild.gradle。そうでない場合は、これと同期を追加します。

android {
...
   dataBinding {
        enabled = true
    }
...
}

2.レイアウトがバインディングレイアウトに変換されていることを確認します

データバインディングクラスを生成する場合は、データバインディング(タグ)でラップxml layoutする必要があります<layout。このようなもの。

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

これに加えて、ビューモデルクラスのようにバインディング変数名が正しいかどうかを確認します。

3.自動生成されたバインディングクラス名?

データバインディングクラスは、バインディングレイアウトを作成した後に生成する必要があります。

レイアウト名がスネークケースの場合 activity_main.xml、データバインディングクラスはのようなキャメルケースで生成されActivityMainBindingます。

4.インポート候補が表示されませんか?

入力するとActivityMai...提案が表示されない場合があります。その場合は手動でインポートしてください

import <yourpackage>databinding.ActivityMainBinding;

5. Build Fail Logcatを読み取ります

ビルドが失敗した場合、バインディングクラスとレイアウトの新しい変数は生成されません。だから、最初のメイクプロジェクトによってはCtrl + F9(ビルド>メイクプロジェクト)

  • ビルドが失敗した場合は、エラーを確認してください。通常、レイアウトフィールドにエラーがあります。エラーログは、問題のあるエラー行番号を示します。
  • バインドが失敗すると、構文エラーやインポートの欠落など、愚かなエラー発生する場合あります。その場合、バインディングクラスのエラーでいっぱいのlogcatを取得します。ただし、適切な問題見つけるには、logcat全体読む必要があります

6.最近のプロジェクトを閉じて開く

Rebuild/ Makeプロジェクトよりもはるかに短い時間がかかるので、私は常にこれを行います。

  • ファイル>プロジェクトを閉じるからプロジェクトを閉じる
  • 最近から再開

IDEの再構築/再起動よりも時間がかからないため、最近から閉じると開くを選択することに注意してください

7.プロジェクトの再構築

それでもクラスが生成されない場合。(レイアウトファイルを貼り付けると、ときどき発生します)。次に、(プロジェクトのビルドまたは作成ではない)からプロジェクトビルドします。データバインディングクラスを生成します。(再構築は私のためにマジックを行います。Build> Rebuild

8.最新のAndroid Studioを持っている

ASをAndroid Studio 3.2に更新した後、データバインディングの自動生成における多くのバグ修正を感じました。したがって、最新のASも必要です。

ソリューション <variables

<data>
    <variable
        name="item"
        type="com.package.Model"/>
</data>

通常、変数をレイアウトに配置すると、そのゲッターとセッターが作成されます。そしてbinding.setItem(item);binding.getItem();していますが、それらのメソッドを見ることができないならば、以下の情報をお読みください。

1.最近のプロジェクトを閉じて開く

データ変数を作成した場合- <variableレイアウトで、データバインディングクラスにセッターとゲッター表示されない場合、RecentからCloseおよびOpen、プロジェクトます。

2.タイプを変更した後のプロジェクトのクリーンアップ

<variableレイアウトの一部のタイプを変更し、ゲッターセッターのタイプが変更されない場合は、プロジェクトのクリーンアップBuild> Clean Project

最後の言葉

最後に、それでもバインディングクラスが生成されない場合は、最も強力な武器があります。- 再起動のAndroidメーカー:D

  • 最初に、単にrestartを試してみてください。これにより、再起動後に常にバインディングレイアウトの変数が生成されます。
  • 動作しない場合は、キャッシュ無効にして再起動してください

これで、データバインディングエラーを解決することができます。さらに問題が発生した場合は、ここでコメントできます。


2
問題が解決しない場合...(8)無効にして再起動します...解決しない場合は、(9)dataBinding {enabled = false} ...ビルドを変更してから、dataBinding {enabled = true}ビルドを再度実行します...
PravyNandas


1
私の場合、何らかの理由でIDEがこれを解決策として表示しないため、クラスパスを手動でインポートする必要がありました。Tnx :)
Ivan Kaloyanov 2018

2
私の日を救った。レイアウトファイルに<layout>ラッピングがありませんでした。ありがとうございました!
ジュリアーノ2018年

「インポートandroid.R」がインポートリストに含まれている場合は、削除する必要があることを追加することもできます。これは、アクティビティxmlファイルへの未解決の参照に関する問題を解決しました
Tim John

23

自動的に生成されるDataBindingクラス。

XML名がactivity_testの場合、BindingクラスはActivityTestBindingになります。

だが、

dataBinding {
        enabled = true
    }

レイアウトにはルートとしてレイアウトが必要です

<layout xmlns:android="http://schemas.android.com/apk/res/android">
</layout>

私はsoultionを何時間も検索していて、gradle magicをたくさん作っていますが、私ConstraintLayoutはルートとして使用しています。ありがとうございました!
アレクセイマルコフ

14

同じ問題がありました。android sdkのドキュメントを読んだ後、作成されるのは予想されるファイル名だけですが、それが発生しない場合の対処方法はありません。さらに調査を行った結果、以下のようにレイアウト要素の名前空間を削除した後(例を使用)、それが機能することがわかりました。

    <?xml version="1.0" encoding="utf-8"?>
    <layout>
        <data>  </data>
        <RelativeLayout
           xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="match_parent"
           android:layout_height="match_parent">
        </RelativeLayout>
    </layout> 

10

私の場合、Bindingクラスが生成され、所定の位置にあります(しかし、そうではないと思いました)...しかし、アクティビティ/フラグメントのインポートセクションに上記のクラスのインポートを自動的に追加しません...だから...オプション+入る :)


2
ビンゴ、私のために働いた、私は手動でインポートを入力しなければならなかったが、インテリセンスは何らかの理由でオプションを提供していませんでした。
ロブ

8

それを適切に設定した後(xml名前空間を含み<layout>、すべてをにラップした後)、私のために機能したのは、ビルド->プロジェクトの作成でした。Clean ProjectやRebuild Projectも実行しませんでした。Android Studio 2.3.1で、26.0.2ビルドツールを使用しています。<data>タグは必要ありません。


これは正解としてマークする必要があります。残りはすべて回避策です。名前空間を移動したり、データ要素を追加したりする必要はありません
Vicky Kapadia

8

ベースジョブを実行する場合、プロジェクトでデータバインドを有効化するために(gradleでenable を使用し、xmlレイアウトタグを使用するなど)、 xmlコードを変更し、それらのxmlの新しいデータバインディングクラスを生成しなかった場合、データのみを生成するための高速な方法を使用できます。gradle-> other-> databindinggenbaseclassesのバインディングクラスプロジェクト全体を一括処理するよりも速くデバッグします。データ生成クラスのみを生成します。 ここに画像の説明を入力してください


4
dataBinding {
        enabled = true
    }

新しいデータバインディングコンパイラを有効にするには、gradle.propertiesファイルに次のオプションを追加します。

android.databinding.enableV2=true

3

データバインディングクラスはビルド中に生成されるため、アプリのGradleビルドでデータバインディングを有効にし、レイアウトタグでxmlを囲んだ後、アプリを再ビルドする必要があります。それでも問題が解決しない場合は、ビルドフォルダーを削除して、もう一度実行してください。


2

ここのこの回答のおかげ - 「レイアウト名前空間」のように見えますクリアする必要があるか、新しい一意の名前が必要なようです。

ここで私のために働いたオプションがあります:

  1. レイアウトの新しい名前を作成して、生成できることを確認します。これにより、データバインディングなしで最初に作成されたレイアウトがあった私の問題が解決しました-それを呼び出しましょうfragment_abc.xml。データバインディングを追加しようとしても、複数のキャッシュをクリアして再起動した後でも、データバインドが認識されませんでした。しかし、レイアウトのコピーを作成するfragment_abc2.xmlとすぐに、生成されたデータバインディング.java / .classオブジェクトがすぐに取得されました。

  2. 上記の作業を確認した後、モジュールから/ buildフォルダーを削除してプロジェクトを再構築しようとしました-これは、元のレイアウトのデータバインディングを取得するために機能しました。


1

私が可能だと想像できる唯一のことはあなたが持っていない場合です

dataBinding {
    enabled true
}

あなたのgradleファイルに。そうでない場合は、gradleファイルに追加してください。すなわち

android {
  ......

  dataBinding {
    enabled true
  }
}

次に、プロジェクトを同期します。それでも失敗する場合は、Androidスタジオの無効化/再起動を行う必要があるかもしれません


私は私の質問で明確に述べましたが、<variable>xml に追加した後、Bindingクラスが生成されるためdataBinding、gradleファイルに追加しない場合、追加していない場合は、バインディングクラスを生成しないはずです。
Ravi

同期して再起動する前。「作る」をしてみてください。それはうまくいきます。
Nizamudeen Sherif

1

うまくいくかどうかはわかりません。レイアウトXMLファイルの名前を変更するだけです。以下のようなあなたのレイアウト名があるとしactivity_main.xmlだけ変化するようなものに名前を変更しmain.xmlし、再び名前を変更しactivity_main.xml。次に、ActivityMainBindingでインポートオプションを確認できます

それがあなたのために働くことを願っています。


1

あなたがで作業する場合、マルチモジュールAndroidアプリケーションあなたのバインディング・クラスパスを確認してください。多分あなたは使うべきです:

import com.yourcompany.app.android.modulename.databinding.FragmentABCtBinding の本能:

import com.yourcompany.app.android.databinding.FragmentABCtBinding



0

同じ問題がありました。あなたがしたすべてが正しい。事はあなたがxmlのデータタグの中に変数を追加する必要があるということです。そのためには、サンプルモデルクラスを作成し、データタグの変数として追加する必要があります。

それまでは、生成されたActivityMainBindingを確認できません。


0

同様の問題があり、レイアウトをラップし、gradleファイルでデータバインディングを有効にしました。メインアクティビティでまだインテリセンスやクラスを見ることができませんでした。私にとってそれを修正したのは、バインディング変数を追加して、とにかくバインディングをインポートすることでした。そこからソリューションを構築したところ、クラスが何であるかがわかったようです。そこから、生成されたラクダのケースクラスをインポートすることができました。


0

私は問題を受け取りました、そして問題は使用されたフィールドが文字列ではなく、それが日付であったレイアウトにありました。

少なくともTexViewコンポーネントでは、すべてのフィールドがテキストで機能する必要があるようです。

コマンド./gradlew build --stacktraceを使用してビルドする場合

これはエラーをよりよく示します。


0

私の場合、生成されたクラスは通常のクラスのsrcフォルダーに表示される必要があると思いました。また、生成されたクラスの名前は少し違うはずだと思いました。それはすべて私の間違いでした。生成されたクラスは、buildフォルダー、build -> generated -> ...パスにあります。生成されたクラスのインポートがアクティビティにない場合は、インポートを追加します

import com.yourcompany.app.databinding.ActivityMainBinding;"

0

DataBindingUtil.setContentViewで次のエラーが発生した場合

未解決の参照:activity_main

次のインポート文を削除するだけで済みます

android.Rをインポートする

別のフォーラムで解決策を見つけました。ソース


0

最近誰かが既存のプロジェクトをandroidxに移行した場合、インポートを置き換える必要があります

import com.yourpackagename.BR;

import androidx.databinding.library.baseAdapters.BR;

Googleの2日後にようやく解決策が得られました。


1
いいえリソース(.R。)のようなバインディングリソース(.BR )。プロジェクトリソース(id、drawable、colorなど)に基づいて生成されたため、プロジェクトパッケージ(your.project.package.BR)内に配置されます。のようなサードパーティのライブラリ内ではありませんandroidx.databinding.library.baseAdapters.BR
-dphans、

0

生成されたディレクトリの下にファイルが表示されない場合があります。viewmodelで宣言されていないプロパティをバインドしている可能性があります。xmlで行うと、基本的にlintエラーが発生しません。


0

あなたが実装されている場合は直列化を - >あなたが実装する必要があります。シリアライズを

そうしないと、このエラーが発生します。それが将来誰かを助けることを願っています

私の場合、Parcelライブラリを使用します。サブクラスで@Parcelに注釈を付けるのに失敗しました


0

上記の手順に加えて、変数の型も確認できます。TextViewの文字列またはで定義されているものと同じであることを確認してくださいBindingAdapter。例えば:

data class MyDataObject(val name: String, val age: Int)

そしてXMLで:

android:text="@{dataobject.age}"

これにより、上記のエラーが発生します。修正するには、string型のage変数を作成するか、XMLにStringをインポートしString.valueOf(age)て次のように使用します。

<data>
    <import type="String" />
...
</data>

そしてあなたのTextViewで:

android:text="@{String.valueOf(dataobject.age)}"

0

私の解決策は、クラス名のFragmentBindingをサフィックスとしてとることでした。

バインディングクラスは、レイアウトファイルごとに生成されます。デフォルトでは、クラスの名前はレイアウトファイルの名前に基づいており、Pascalの大文字と小文字に変換し、Bindingサフィックスを追加します。上記のレイアウトファイル名はactivity_main.xmlであるため、対応する生成クラスはActivityMainBindingです。このクラスは、レイアウトプロパティ(ユーザー変数など)からレイアウトのビューへのすべてのバインディングを保持し、バインディング式に値を割り当てる方法を認識しています。

アクティビティまたはフラグメントクラスの名前の命名法は、接頭辞が異なる場合があります。なぜなら、接尾辞は常にBindingだからです。

KhemrajおよびInvalidate Caches / Restartの応答を追跡した後、ActivityBindingまたはFragmentBindingを書き換える必要がありますをすでに生成されたクラスのIDE提案を取得し、インポートをハードコーディングしないでください。

私の場合、クラスの名前をではFragmentCompetitionsBindingなく逆にインポートしようとしましたCompetitionsFragmentBinding

GL

ソース


0

私の場合、ミップマップAndroidリソースディレクトリを削除したため、データバインディングクラスは生成されませんでした。res / mipmap /ディレクトリを再作成し、データバインディングクラスを復元​​しました。


0

DataBindingがBindingImplクラスの生成に失敗したという同様の問題が発生しました。私の場合、名前が誤って使用されているデータクラスのメソッドの問題でした。モデルにはonSignInCliked()メソッドが含まれており、レイアウトにはonSigninCliked()を使用していました。注意してくださいサインイン VS サインインもを

エラーメッセージは十分ではなく、スタックトレースオプションを指定してビルドスクリプトを使用した場合にのみ問題が見つかりました。


0

データバインディングが有効になっていることを確認する

android {
...
   dataBinding {
        enabled = true
    }
...
}

Gradleとプロジェクトを同期する ボタンをクリックします(Gradleとプロジェクトを同期します)


0

XMLファイルに問題がある場合、Databindingクラス生成されん。簡単な修正は、XMLファイルを実行して構文エラーをチェックすることです(通常は赤で強調表示されます)。エラーは、存在しないか間違った参照、誤植などの形で発生する可能性があります。

基本的に、XMLコードに赤い下線が引かれていないことを確認してください。完了したら、再構築すると、Databindingクラスが生成されます。


-1

1.アプリのgradleに以下を追加

 dataBinding {
        enabled = true
    }

2. xmlレイアウトでコードの下に書き込む

<layout
    xmlns:android="http://schemas.android.com/apk/res/android">
  <data></data>
</layout>if you don't get data binding class just rename the layout file name and you will get data binding class.

3
一般的に、dataBindingでインターネットの許可が必要なのはなぜですか?
M.Pomeroy 2018

1
@ M.Pomeroyはい、必要ありません。回答を編集していません。ありがとう
Rohan Lodhi

-5

クラスパス「com.android.databinding:dataBinder:1.0-rc0」を使用します


Gradle 1.5.0以降では、このクラスパスを使用する必要はありません。
Ravi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.