ピカソで画像を表示するためのバインディングアダプタを作成しましたが、機能しません。次のエラーがあります:
データバインディングエラーが見つかりました。 **** /データバインディングエラー**** msg:Android.widget.ImageViewでパラメータタイプJava.lang.Stringの属性 'app:loadPicture'のセッターが見つかりません。 file:/home/groupevsc.com/mathieu_labar/Documents/Projects/Android-jetpack/app/src/main/res/layout/activity_detail_movie.xml loc:27:31-27:52 **** \データバインディングエラー* ******
これが私のバインディングアダプターです:
object CommonBindingUtil {
@JvmStatic
@BindingAdapter("loadPicture")
fun loadPicture(view: ImageView, text: String) {
Picasso.with(view.context)
.load(text)
.error(R.drawable.ic_movie_24)
.fit()
.placeholder(R.drawable.ic_movie_24)
.into(view)
}
}
そして私のXMLには属性「app:loadPicture」があります:
<ImageView
Android:id="@+id/picture"
Android:layout_width="@dimen/material_image_simple_width"
Android:layout_height="wrap_content"
Android:adjustViewBounds="true"
Android:scaleType="fitXY"
Android:src="@drawable/ic_movie_24"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:loadPicture="@{viewModel.movie.Poster}"/>
これが私のGitHubリポジトリです: https://github.com/mlabar/Android-jetpack/tree/tech_ajout_databinding
誰かが私の問題を解決するためのアイデアを持っていますか?
ありがとうございました!
@Blackbeltに問題を解決していただき、ありがとうございます。すべてのbuild.gradle
モジュールに「kotlin-kapt」を追加しました。
apply plugin: 'kotlin-kapt'
これが私のコードです
@JvmStatic
@BindingAdapter({"bind:loadPicture"})
fun loadPicture(view: ImageView, loadPicture: String) {
Picasso.with(view.context)
.load(loadPicture)
.error(R.drawable.ic_movie_24)
.fit()
.placeholder(R.drawable.ic_movie_24)
.into(view)
}
詳細については、私のプロジェクトを参照してください GitHub
アダプター関数をバインドするための正しいパラメーターを渡していない。
オブジェクトCommonBindingUtil {
@JvmStatic
@BindingAdapter("loadPicture")
fun loadPicture(view: ImageView, text: String) {
Picasso.with(view.context)
.load(text)
.error(R.drawable.ic_movie_24)
.fit()
.placeholder(R.drawable.ic_movie_24)
.into(view)
}
}
ここで、loadPicture
関数はパラメータimageView
と文字列を必要としますが、ここでは、xmlで写真のオブジェクトを渡します
app:loadPicture="@{viewModel.movie.Poster}
代わりに、次のようなものを書く必要がありますapp:loadPicture="@{viewModel.movie.Poster.url}
MovieViewModelクラスを次のように変更します。
class MovieViewModel(private val movie: Movie) : Observer, BaseObservable() {
init {
Movie.addObserver(this)
}
val Poster: String
@Bindable get() {
return Poster.name
}
}
そしてMovie次のようなクラス:
class Movie: Observable() {
var Title: String = ""
set(value) {
field = value
setChangedAndNotify("Title")
}
var Year: String = ""
set(value) {
field = value
setChangedAndNotify("Year")
}
var imdbID: String = ""
set(value) {
field = value
setChangedAndNotify("imdbID")
}
var Type: String = ""
set(value) {
field = value
setChangedAndNotify("Type")
}
var Poster: String = ""
set(value) {
field = value
setChangedAndNotify("Poster")
}
var Plot: String = ""
set(value) {
field = value
setChangedAndNotify("Plot")
}
private fun setChangedAndNotify(field: Any) {
setChanged()
notifyObservers(field)
}
}
必要に応じてクラスコンテキストを作成し、問題が解決することを期待して実行します。