web-dev-qa-db-ja.com

Android-DataBinding-Bindingクラスが生成される方法とタイミング

データバインディングガイド 状態

  By default, a Binding class will be generated based on the name of the layout 
file, converting it to Pascal case and suffixing “Binding” to it. 
The above layout file was activity_main.xml so the generate class was ActivityMainBinding.

Bindingクラス、ここではActivityMainBindingが生成されるのはいつですか。コンパイル時エラーがあります。 「ActivityMainBindingを解決できません」。

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);

どんな助けも大歓迎です。ありがとう

64
sowmia

レイアウト名は何ですか?

上記のレイアウトファイルはactivity_main.xmlであったため、生成クラスはActivityMainBindingでした。

つまり、生成されたクラス名はレイアウトの名前に依存するということです。

activity_main.xml-> ActivityMainBinding.Java

あなたのアクティビティ名は「main_activity」だと思うので、生成されたバインディングクラス名は、ActivityMainBindingではなくMainActivityBindingである必要があります。

87
Mao

バインディングクラスを生成していないときに、Android studioを再起動します。次に、バインディングクラスが生成されます。 Android studioのキャッシュが原因ではありませんか?

ところで、Android-aptを使用している場合は、確認してください。バインディングクラスが生成されないためです。

35
Frank Cheng

データバインディング用にレイアウトファイルを更新しましたか?データバインディングのあるレイアウトに対してのみ生成されます。

2つの子タグ(データとルートビュー)を持つlayoutタグで開始する必要があります。

このようなもの:

<?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 ...
   </LinearLayout>
</layout>

レイアウトにこのフォームがある場合、AndroidStudioはクラスを自動補完する必要があります。また、デフォルトでは、<your.app.package>.databindingパッケージで生成されます。

27
yigit

レイアウトの名前をmain_activity.xmlに変更してみてください

私の場合、「activity_main.xml」のバインディングクラスを生成することはできませんでした。
ただし、レイアウトファイルの名前をmain_activity.xmlに変更しても問題なく機能しました。

14
surlac

ルール

レイアウト名はsnake_caseにあり、生成されるバインディングクラス名はCamelCase

レイアウト名がactivity_home.xmlの場合、バインディングクラス名はActivityHomeBinding.classになります。

問題

  1. 多くの場合、DataBindingクラスのインポートの提案はありません。
  2. レイアウトに問題がある場合、バインディングクラスは生成されません。
  3. ビルドが失敗した場合、バインディングクラスは使用できません

ハックです

インポート候補が表示されない場合

  • インポートの提案が得られないとき。このようにバインディングクラスを手動でインポートします。 (IDEでは、クラスのバインドに関する提案が表示されないことがよくあります)

    import <yourpackage>databinding.ActivityMainBinding;
    

インポート行にまだエラーが表示されますか?

  • インポート行にエラーが表示される場合は、make project(ctrl + F9)/Build> Make Project。 。
    1. 何らかのエラーによりビルドが失敗した場合は、解決します。
    2. ビルドが成功すると、バインディングクラスが生成されます。

バインディングクラスを生成するためのクイックハック-

  • バインディングクラスが生成されない場合、close project(File> Close Project)およびrecent

注意してください最近からclose and openをお勧めしますより短い時間よりもRebuild/IDEを再起動

バインディングクラスでレイアウト変数を生成するためのクイックハック-

  • レイアウトデータ変数が生成されない場合、close project(File> Close Project)およびrecent

それでも問題がある場合。コメントでお知らせください。または、より良い理解のために この回答 をご覧ください。

10
Khemraj

独自のバインディングクラス名を指定したい場合は、クラス名を持つclass属性にdata属性を追加するだけです。

データ要素のクラス属性を調整することにより、バインディングクラスの名前を変更したり、異なるパッケージに配置したりできます。

<data class="ContactItem">
    ...
</data>

<data class="com.example.ContactItem">
...
</data>
4
Bharatesh

私の場合、Android St​​udioの再起動は機能します。 Android-aptのバグです

4

以下のレイアウトを確認してください。

 <data>
   <variable name="user" type="com.example.User"/>
 </data>

ActivityMainBindingを探している場合は、activity_main.xmlにあります。ほとんどのボイラープレートプロジェクトでは、コンテンツビューをactivity_main.xmlに設定しますが、fragment_main.xmlを拡張します。

<data>fragment_main.xmlレイアウトに配置すると、生成されるクラスはFragmentMainBindingになります。

注:これは、読んでみると明らかなように思えるかもしれませんが、Androidのドキュメントに従うと簡単に見落とされる可能性があります。

4
CodyF

単純な再起動だけではうまくいきませんでした。 Invalidate Caches and Restartをしなければならなかったので、バインディングクラスを見ることができました。知らない人のためのFileメニューの下にあります。

1
IsaiahJ

Androidデータバインディングが正常に機能するには、Android gradle用ツール(com.Android.tools.build:gradle)> = 1.3.0を使用する必要があります。

したがって、プロジェクトbuild.gradleは次のようになります。

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:1.3.0'
        classpath "com.Android.databinding:dataBinder:1.0-rc1"
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

そして、モジュールbuild.gradleにはそのプラグインが必要です:

apply plugin: 'com.Android.databinding'

結局、最新のbuildToolsVersionを使用しているモジュールをチェックインしてください(現在は22.0.1です)。それが必要かどうかはわかりませんが、「テクノロジーの最先端」にいることについて気分が良くなる可能性があります^ _ ^:

buildToolsVersion '22.0.1'

Gradleとプロジェクトの再構築を再同期します。プロジェクトを再構築しないと、SomeLayoutBindingクラスが生成されない可能性があります。

アプリケーションメニューから実行できるAndroid St​​udio:Build -> Rebuild project

私の経験では、[ビルド]> [プロジェクトの再構築]をクリックすると、Android St​​udio 3.1.3がデータバインディングクラスを生成しました。ファイルは次の場所に保存されました。

\ Project\app\build\generated\source\apt\development\debug\project\Android\app\databinding

ただし、Android St​​udiostillは、ソースコードでバインディングクラスを「不明」として報告しました。

最終的に修正するために、私は手動importステートメントを追加しました:

import project.Android.app.databinding。*;

1

同じ問題に直面した。

「ActivityMainBindingを解決できない」理由は、バインディングファイルが生成されないためです。プロジェクトをきれいにして再構築してみてください。また、手順に従っていることを確認してください。

  1. クラスパス "com.Android.databinding:dataBinder:1.0-rc4"->これをメインモジュールビルドファイルに含める
  2. プラグインを適用: 'com.Android.databinding'アプリモジュール構築中
  3. 掃除
  4. 再構築します。 build-> indermediates-> your package name-> databindingフォルダーがActivityMainBindingクラスを含んで生成されている場合、下を確認します。

または、生成されたソースを表示する場合。

  1. classpath 'com.neenbedankt.gradle.plugins:Android-apt:1.7'->メインモジュールに適用します。
  2. プラグインの適用: 'com.neenbedankt.Android-apt'->アプリモジュールへ
  3. apt 'com.Android.databinding:compiler:1.0-rc0'->依存関係に含めます。

これらのクラスは、最初のビルドで生成されます。また、アプリケーションモジュールのapplicationIdが、アプリモジュールのAndroidManifest.xmlのパッケージ名と同じであることを確認してください。お役に立てれば。

1

オブジェクトのフィールドアクセスレベルを確認します。公開すると、ここで機能しました

0
Kleyton Santos

私の場合、レイアウトタグを<layout></layout>タグで囲むだけで、データタグを追加せずに、データバインディングを生成できました。お役に立てれば。

<data>
       <variable name="user" type="com.example.User"/>
</data>
0
Qasim

Android studioを再起動したくない場合、1つの方法は、activity_main.xmlの名前を別の名前(例:activity_m.xml)に変更してから、再びactivity_main.xmlに名前を変更することです。 Android studioを再起動するよりもはるかに高速です。

名前を変更するには、activity_main.xmlを右クリックしてリファクタリング => リネームを選択します

0
tick t

Android-studioの奇妙な「バグ」により、生成されたBR.Javaファイルは@Bindableフィールドを使用せず、res/layoutディレクトリが存在しない場合に_allプロパティのみを保持します。

「アクティビティなし」アプリを作成して、バインド可能なさまざまなデータを含むライブラリを作成したいと思いました。

0
<data class="MainActivityBinding">
    <variable
        name="user"
        type="com.example.administrator.my_mvvm.User" />
</data>

// Build-> Rebuild Projectが必要であることを忘れないでください

0
a442509097