web-dev-qa-db-ja.com

データバインディングが「推測できませんでした」で失敗する

Android Studio 3.2.0にアップデートしてから、次の問題が発生します。

タスク ':mobile:dataBindingGenBaseClassesDebug'の実行に失敗しました。

> com.ACME.database.model.Orderを推測できませんでした

これも見られます answer 、これは「パッケージ名は小文字で始まらなければならない」ことを示唆しています。

...このvariable割り当てが原因であるかのように、似ているように見えます。

<data class=".databinding.OrderFragmentBinding">
    <variable name="order" type="com.ACME.database.model.Order"/>
    ...
</data>

見つかった: クラスをバインドするための新しいデータバインディングコンパイラ 、動作の変更を説明していません。

[〜#〜] q [〜#〜]:そのような割り当てもその命名規則の影響を受けますか?つまり、(大文字のパッケージ名を変更する以外に)データバインディングv2の「推測」が機能する可能性はありますか?

2
Martin Zeitler

gradle.propertiesのこれらの設定は、androidxデータバインディングコンパイラを有効にします。

Android.databinding.enableV2 = false
Android.enableExperimentalFeatureDatabinding = true

フェッチされたパッケージでそれを見ることができます:

Download https://dl.google.com/dl/Android/maven2/androidx/databinding/databinding-compiler/3.2.0/databinding-compiler-3.2.0.pom
Download https://dl.google.com/dl/Android/maven2/androidx/databinding/databinding-compiler/3.2.0/databinding-compiler-3.2.0.jar

そしてそれは不平を言う:

WARNING: The option setting 'Android.databinding.enableV2=false' is experimental and unsupported.
The current default is 'true'

WARNING: The option setting 'Android.enableExperimentalFeatureDatabinding=true' is experimental and unsupported.
The current default is 'false'

Fragmentをデフォルトのv2データバインディングコンパイラでデータバインディングするには、androidx.fragment.app.FragmentではなくAndroid.support.v4.app.Fragmentが必要になる可能性があります。これも一時的な解決策ですが、v1データバインディングコンパイラに戻すよりも優れています。

7
Martin Zeitler

3.2にアップデートした後も同じことが起こります(移行前にアプリケーションが機能し、コードは変更されていません)...パッケージ名の最初の文字に小文字が含まれていても、この「推測」の問題です。

<data>
   ...
   <variable name="rule" type="com.gta.viewmodels.vmRule"/>
   ...
</data>

したがって、パッケージ名を更新した後も問題は残ると「推測」します(問題が発生した場合は、とにかくベストプラクティスですアップグレードするたびにAndroid Studio !)。

とにかく、私はgradle.propertiesのv2データバインディングをダウングレードすることで解決しました(「サポートされていない」警告が表示されますが、無視してください):

Android.databinding.enableV2=false

Android Studio PGはこのアサーションを十分にテストしていないようです( ここ ):

Data Binding V2 is now enabled by default and is compatible with V1.

3
gtrevi