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.
満足のいく答えが得られませんでした。だから、ここに私のデータバインディングの知識の要約であるヒントがあります。
より正確なエラーおよび提案を取得するには、Android StudioおよびGradleプラグインのバージョンを最新に更新することを強くお勧めします。 AS 3.2バージョン以降、多くの問題に直面していないためです。
最新Android Studio および 最新Gradleプラグイン を参照してください。
この回答を読んだ後、データバインディング自動生成の問題クラスとデータ変数の両方でスタックすることはありません。
これらのポイントを1つずつ確認してください。これらのどれでもあなたの仕事を終わらせることができます。 ポイント3から最後までは本当に重要なので、お見逃しなく。
build.gradle
でデータバインディングを有効化する必要があります。そうでない場合は、これとSyncを追加します。
Android {
...
dataBinding {
enabled = true
}
...
}
データバインディングクラスを生成する場合は、データバインディングで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>
データバインディングクラスは、バインディングレイアウトの作成後に生成する必要があります。
レイアウト名がsnake case
activity_main.xml
である場合、データバインディングクラスはActivityMainBinding
のようにcamel caseで生成されます。
時々ActivityMai...
と入力すると、候補は表示されません、その場合は手動でインポート。
import <yourpackage>databinding.ActivityMainBinding;
ビルドが失敗した場合、レイアウト内のバインディングクラスと新しい変数は生成されません。最初にプロジェクトの作成をCtrl + F9(ビルド>プロジェクトの作成)で行います。
Rebuild
/Make
プロジェクトよりも時間がかからないため、私は常にこれを行います。
ことに注意してください私は最近のから閉じると開くを好む再構築/再起動IDE 。
それでもクラスが生成されない場合。 (レイアウトファイルを貼り付けると、それが発生する場合があります)。次にプロジェクトの再構築からBuild> Rebuild
(プロジェクトの構築または作成ではありません)。データバインディングクラスが生成されます。 (再構築は私のためにマジックを行います。)
ASを Android Studio 3.2 に更新した後、データバインディングの自動生成で多くのバグ修正を感じました。したがって、最新のASも必要です。
<variables
のソリューション<data>
<variable
name="item"
type="com.package.Model"/>
</data>
通常、レイアウトに変数を配置すると、そのゲッターとセッターが作成されます。 binding.setItem(item);
とbinding.getItem();
を使用できますが、そのメソッドが表示されない場合は、以下の情報をお読みください。
レイアウトに<variable
_データ変数を作成し、データバインディングクラスにセッターとゲッターが表示されないの場合、最近から閉じて開くプロジェクト。
レイアウトでいくつかの<variable
のタイプを変更し、ゲッターセッターのタイプが変更されていない場合は、Clean project(Build> Clean Project
)
最後に、まだバインディングクラスが生成されない場合、最も強力な武器があります。 -再起動Android Studio:D
これが、データバインディングエラーを解決するためのすべてのことです。さらに問題が発生した場合は、ここでコメントできます。
自動的に生成されたDataBindingクラス。
xml名がactivity_testの場合、BindingクラスはActivityTestBindingになります。
しかし、
dataBinding {
enabled = true
}
レイアウトには、ルートとしてレイアウトが必要です
<layout xmlns:Android="http://schemas.Android.com/apk/res/Android">
</layout>
同じ問題がありました。 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>
私の場合、Bindingクラスが生成され、適切な場所に配置されました(しかし、そうではないと思っていました)...入る :)
適切にセットアップした後(xml名前空間を含め、すべてを<layout>
にラップ)、私のために働いたのはBuild-> Make projectでした。 Clean ProjectやRebuild Projectもしませんでした。私はAndroid Studio 2.3.1で、26.0.2ビルドツールを使用しています。 <data>
タグは不要です。
dataBinding {
enabled = true
}
新しいデータバインディングコンパイラを有効にするには、次のオプションをgradle.propertiesファイルに追加します。
Android.databinding.enableV2=true
データバインディングクラスはビルド中に生成されるため、アプリのGradleビルドでデータバインディングを有効にし、アプリを再構築する必要があります。それでも解決しない場合は、ビルドフォルダーを削除して再度実行してください。
こちらの回答 - "layout namespace"をクリアするか、新しい一意の名前が必要なようです。
私のために働いたオプションは次のとおりです。
レイアウトの新しい名前を作成して、生成できることを確認します。これにより、データバインディングなしで最初に作成されたレイアウトがあった問題を解決しました-fragment_abc.xml
と呼びましょう。データバインディングを追加しようとしても、複数のキャッシュをクリアして再起動した後でも認識されませんでした。ただし、レイアウトfragment_abc2.xml
のコピーを作成するとすぐに、生成されたデータバインディング.Java/.classオブジェクトがすぐに得られました。
上記の作業を見た後、モジュールから/ buildフォルダーを削除し、プロジェクトを再構築しました-これは元のレイアウトのデータバインディングを取得するために機能しました。
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スタジオの無効化/再起動を行う必要があります。
私は問題を受け取り、問題は使用されたフィールドが文字列ではなく、日付であったレイアウトにありました。
少なくともTexViewコンポーネントでは、すべてのフィールドが機能するテキストになっているように見えます。
コマンド./gradlew build --stacktraceでビルドする場合
これにより、エラーが改善されます。
私の場合、生成されたクラスはsrc
フォルダーの通常のクラスと一緒に表示する必要があると考えました。さらに、生成されたクラスの名前は少し異なるべきだと思いました。それはすべて私の間違いでした。生成されたクラスは、build
フォルダー、build -> generated -> ...
パスにあります。アクティビティに生成されたクラスのインポートがない場合、インポートを追加します
import com.yourcompany.app.databinding.ActivityMainBinding;"
レイアウトがラップされ、データバインディングがgradleファイルで有効になっている同様の問題がありました。主な活動はまだインテリセンスや私のクラスを見ることはできませんでした。私にとってそれを修正したのは、とにかくバインディング変数を追加し、バインディングをインポートすることでした。そこからソリューションを構築したところ、クラスが何であるかがわかったようです。そこから、生成されたラクダケースクラスをインポートできました。
同じ問題がありました。あなたがしたすべてが正しい。 xmlのデータタグ内に変数を追加する必要があるということです。そのためには、サンプルモデルクラスを作成し、データタグの変数として追加する必要があります。
それまでは、生成されたActivityMainBindingを見ることができません。
既存のプロジェクトをandroidxに最近移行した場合は、インポートを置き換える必要があります
import com.yourpackagename.BR;
に
import androidx.databinding.library.baseAdapters.BR;
Googleの2日後、ようやく解決策が得られました。私の場合、これが役立ちます。時間の節約に役立つことを願っています。それがあなたのために働くなら、この解決策を支持してください。
DataBindingUtil.setContentViewで次のエラーが発生した場合
未解決の参照:activity_main
必要なのは、次のimportステートメントを削除することだけです
android.Rをインポートする
別のフォーラムで解決策を見つけました。 ソース
私はそれがあなたのために働くかどうかわかりません。ただrenameレイアウトXMLファイル名。レイアウト名がactivity_main.xmlの場合、名前をmain.xmlのような名前に変更し、再度名前をactivity_main.xmlに変更します。その後、ActivityMainBindingでインポートオプションを確認できます。
それがあなたのために働くことを願っています。
レイアウトを削除して元に戻し、生成されたバインディングクラスがその後正しくインポートされることを確認します。