web-dev-qa-db-ja.com

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

Xmlバインディングクラスで<layout>および<data>を使用していないときに、プロジェクトでデータバインディングを使用しています。

たとえば、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と書いている場合、クラスが利用できないというエラーが表示されます。しかし、XMLファイルに<variable>を含めると、ActivityMainBindingクラスを生成できます。

Android Studio:2.1.
クラスパス:com.Android.tools.build:gradle:2.1.
minSdkVersion 16
targetSdkVersion 24
buildToolsVersion 24.0.

61
Ravi Rupareliya

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

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

更新

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

最新Android St​​udio および 最新Gradleプラグイン を参照してください。

元のソリューション

この回答を読んだ後、データバインディング自動生成の問題クラスとデータ変数の両方スタックすることはありません

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

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

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

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.自動生成されたバインディングクラス名?

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

レイアウト名がsnake caseactivity_main.xmlである場合、データバインディングクラスはActivityMainBindingのようにcamel caseで生成されます。

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

時々ActivityMai...と入力すると、候補は表示されません、その場合は手動でインポート

    import <yourpackage>databinding.ActivityMainBinding;

5. Build Fail Logcatを読む

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

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

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

Rebuild/Makeプロジェクトよりも時間がかからないため、私は常にこれを行います。

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

ことに注意してください私は最近のから閉じると開くを好む再構築/再起動IDE

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

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

8.最新のAndroid St​​udioがある

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

<variablesのソリューション

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

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

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

レイアウトに<variable_データ変数を作成し、データバインディングクラスにセッターとゲッターが表示されないの場合、最近から閉じて開くプロジェクト。

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

レイアウトでいくつかの<variableのタイプを変更し、ゲッターセッターのタイプが変更されていない場合は、Clean project(Build> Clean Project

最後の言葉

最後に、まだバインディングクラスが生成されない場合、最も強力な武器があります。 -再起動Android St​​udio:D

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

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

107
Khemraj

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

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

しかし、

dataBinding {
        enabled = true
    }

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

<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
</layout>
21
ViramP

同じ問題がありました。 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> 
11
ngaspama

私の場合、Bindingクラスが生成され、適切な場所に配置されました(しかし、そうではないと思っていました)...入る :)

10

適切にセットアップした後(xml名前空間を含め、すべてを<layout>にラップ)、私のために働いたのはBuild-> Make projectでした。 Clean ProjectやRebuild Projectもしませんでした。私はAndroid St​​udio 2.3.1で、26.0.2ビルドツールを使用しています。 <data>タグは不要です。

8
Xtreme Biker

ベースジョブを行う場合、プロジェクトでデータバインドを有効にするには、usegradleで有効にし、次のlayoutタグを使用しますxml、xmlコードを変更し、それらのxmlに新しいデータバインディングクラスを生成しなかった場合、gradle-でデータバインディングクラスのみを生成する高速な方法を使用できます。 > other-> databindinggenbaseclassesDebugそれはプロジェクト全体よりも高速です。データバインディングクラスのみを生成します。 enter image description here

5
Mahdi Azadbar
dataBinding {
        enabled = true
    }

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

Android.databinding.enableV2=true
3

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

2
Schadenfreude

こちらの回答 - "layout namespace"をクリアするか、新しい一意の名前が必要なようです。

私のために働いたオプションは次のとおりです。

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

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

2
Gene Bo

multimodule Android applicationを使用する場合は、バインディングクラスパスを確認してください。たぶんあなたは使うべきです:

import com.yourcompany.app.Android.modulename.databinding.FragmentABCtBinding insted:

import com.yourcompany.app.Android.databinding.FragmentABCtBinding

可能であれば想像できる唯一のものはあなたが持っていない場合です

dataBinding {
    enabled true
}

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

Android {
  ......

  dataBinding {
    enabled true
  }
}

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

1

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

少なくともTexViewコンポーネントでは、すべてのフィールドが機能するテキストになっているように見えます。

コマンド./gradlew build --stacktraceでビルドする場合

これにより、エラーが改善されます。

0
jactive

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

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

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

0
stegnerd

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

それまでは、生成されたActivityMainBindingを見ることができません。

0
Srinivasan

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

import com.yourpackagename.BR;

import androidx.databinding.library.baseAdapters.BR;

Googleの2日後、ようやく解決策が得られました。私の場合、これが役立ちます。時間の節約に役立つことを願っています。それがあなたのために働くなら、この解決策を支持してください。

0
Milan Sheth

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

未解決の参照:activity_main

必要なのは、次のimportステートメントを削除することだけです

android.Rをインポートする

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

0
Tim John

私はそれがあなたのために働くかどうかわかりません。ただrenameレイアウトXMLファイル名。レイアウト名がactivity_main.xmlの場合、名前をmain.xmlのような名前に変更し、再度名前をactivity_main.xmlに変更します。その後、ActivityMainBindingでインポートオプションを確認できます。

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

0
Sudhansu

レイアウトを削除して元に戻し、生成されたバインディングクラスがその後正しくインポートされることを確認します。

0