1. ホーム
  2. android

[解決済み] データバインディングクラスが生成されない

2022-08-18 07:17:54

質問

私はプロジェクトでデータバインディングを使用しています。 <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 と書くと、クラスが利用できないというエラーが表示されます。しかし <variable> を含めると、その後に ActivityMainBinding クラスを生成することができます。

Android Studioの: 2.1.3

クラスパス: com.android.tools.build:gradle:2.1.3です。

minSdkVersion 16

ターゲットSdkバージョン 24

buildToolsVersion 24.0.0

どのように解決するのですか?

納得のいく回答は得られませんでした。そこで、私のデータバインディングの知識をまとめたTipsを紹介します。

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

更新

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

参照 最新のAndroid Studio を、そして 最新の Gradle プラグイン .

オリジナルソリューション

この回答を読んだ後、あなたは に引っかかることはありません。 データバインディング自動生成の問題で クラスとデータ変数の両方について .

これらのポイントを一つずつ確認してください。どれか一つでもあれば、仕事がはかどります。 3から最後までは本当に重要なので、見逃さないようにしましょう。

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

データバインディングが有効になっていることを確認します。 データバインディングが有効である build.gradle . もしそうでなければ、これを追加して 同期 .

android {
    ...
    buildFeatures {
        dataBinding 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. ビルド失敗ログキャットの読み込み

ビルドに失敗すると、バインディングクラスやレイアウトの新しい変数が生成されません。そこでまず プロジェクトを作成します。 Ctrl + F9 (ビルド > プロジェクト作成) .

  • ビルドに失敗した場合、何がエラーなのかを確認します。通常、レイアウトフィールドでエラーが発生します。エラーログは、問題のあるエラー行番号を指摘します。
  • バインディングの可能性 失敗 いくつかの 愚かなエラー のような、構文エラーやインポートの欠落が発生します。この場合、バインディングクラスのエラーでいっぱいのログキャストを取得することになります。しかし、あなたは は完全なログキャストを読む必要があります。 になります。 適切な問題を見つける .

6. 最近からプロジェクトを閉じたり開いたりする

よりもはるかに短い時間で済むので、私はいつもこうしています。 Rebuild / Make プロジェクトで使用されます。

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

注意 私は 閉じたり開いたり よりも 最近の よりもはるかに短い時間で済むので IDEのリビルド/再起動 .

7. リビルドプロジェクト

それでもクラスが生成されない場合。(レイアウトファイルを貼り付けると発生することがあります)。そこで プロジェクトをリビルドしてください。 から Build> Rebuild ( ビルドやメイクのプロジェクトではありません ). データバインディングクラスが生成されます。( RebuildはMagicをやってくれる。 )

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 を作成し、それが はそのセッターとゲッターを表示しません。 をデータバインディングクラスで使用する場合 最近から閉じる、開く を実行してください。

2. タイプ変更後のクリーンなプロジェクト

もし、ある <variable が変更され、ゲッターセッターの型が変更されなかった場合 クリーンプロジェクト( Build> Clean Project )

最後の言葉

最後に、まだバインディングクラスが生成されていない場合、私たちの最も強力な武器があります。- Android Studioを再起動する。

  • まず を再起動してみてください。 これは、再起動後に常に私のバインディングレイアウトの変数を生成します。
  • もしうまくいかない場合は キャッシュを無効にし、再起動します。 .

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