web-dev-qa-db-ja.com

Android-バインディングアダプターが機能しない

ピカソで画像を表示するためのバインディングアダプタを作成しましたが、機能しません。次のエラーがあります:

データバインディングエラーが見つかりました。 **** /データバインディングエラー**** 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

誰かが私の問題を解決するためのアイデアを持っていますか?

ありがとうございました!

7
MLabar

@Blackbeltに問題を解決していただき、ありがとうございます。すべてのbuild.gradleモジュールに「kotlin-kapt」を追加しました。

apply plugin: 'kotlin-kapt'
24
MLabar

これが私のコードです

@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

2
fightingCoder

アダプター関数をバインドするための正しいパラメーターを渡していない。

オブジェクト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}

0
Muheeb Mehraj

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)
    }
}

必要に応じてクラスコンテキストを作成し、問題が解決することを期待して実行します。

0
HassanUsman