web-dev-qa-db-ja.com

Kotlinでの成功後のグライドコールバック

   private SimpleTarget target = new SimpleTarget<Bitmap>() {  

    @Override
    public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) {
        // do something with the bitmap
        // for demonstration purposes, let's just set it to an ImageView
        imageView1.setImageBitmap( bitmap );
    }
};

private void loadImageSimpleTarget() {  
    Glide.with(context)
        .load(uri)
        .override(600, 600)
        .fitCenter()
        .into(target);
}

以下のようにKotlinに変換してみました。

val finish_target = object : SimpleTarget<Bitmap>() {
                override fun onResourceReady(bitmap: Bitmap?, glideAnimation: GlideAnimation<in Bitmap>?) {
                    preview_image.setImageBitmap(bitmap)
                }
            }

        Glide.with(context)
                .load(uri)
                .override(600, 600)
                .fitCenter()
                .into(finish_target)

しかし、コンパイルエラーはそれを示しています

public open fun <Y : Target<GlideDrawable!>!> into(target: (???..???)): (???..???) defined in com.bumptech.glide.DrawableRequestBuilder
public open fun into(view: ImageView!): Target<GlideDrawable!>! defined in com.bumptech.glide.DrawableRequestBuilder

この問題の解決方法を教えてください。

11
Than Htike Aung
 Glide.with(context)
        .load(url)
        .listener(object : RequestListener<Drawable> {
            override fun onLoadFailed(p0: GlideException?, p1: Any?, p2: Target<Drawable>?, p3: Boolean): Boolean {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }
            override fun onResourceReady(p0: Drawable?, p1: Any?, p2: Target<Drawable>?, p3: DataSource?, p4: Boolean): Boolean {
                Log.d(TAG, "OnResourceReady")
                //do something when picture already loaded
                return false
            }
        })
        .into(imgView)

Glideを使用すると、チェーンにListenerを追加できます。これにより、画像の読み込み状態を監視できます。 2つのメソッドをオーバーライドする必要があります。onResourceReadyメソッドでは、イメージが既にロードされていて、ローダーを非表示にしたり、別のビューからアニメーションを終了したりすることができるというコールバックがあります。 onLoadFailedでは、ロード中のエラーに関する情報を取得し、何らかの方法で対応できます。これにより、これらのエラーを回避できます。

5
Paulina

問題は、Javaコードで、タイプSimpleTargettargetのタイプとして使用したことです。これは生のタイプです(汎用パラメーターがありません)。 Javaジェネリックスの大きなレガシー問題の1つです。Kotlinはraw型を許可しないため、変換中に問題が発生したのはこのためです。

これを修正するには、Javaで以下を実行する必要があります。

_private SimpleTarget<Bitmap> target = new SimpleTarget<Bitmap>() { ... }
_

これにより、Glide呼び出しにasBitmap()を追加する必要があります。

_Glide.with(context)
        .load(uri)
        .asBitmap()
        .override(600, 600)
        .fitCenter()
        .into(target);
_

コードでジェネリックを安全に使用しているので、問題なくKotlinに変換できます。

_Glide.with(context)
        .load(uri)
        .asBitmap()
        .override(600, 600)
        .fitCenter()
        .into<SimpleTarget<Bitmap>>(target)
_
5
zsmb13

Glide 3.8を使用している場合:

 Glide.with(this)
      .load(imgUrl)
      .listener(object : RequestListener<String, GlideDrawable> {
                        override fun onException(e: Exception?, model: String?, target: Target<GlideDrawable>?, isFirstResource: Boolean): Boolean {
                            return false
                        }
                        override fun onResourceReady(resource: GlideDrawable?, model: String?, target: Target<GlideDrawable>?, isFromMemoryCache: Boolean, isFirstResource: Boolean): Boolean {
                            return false
                        }
                    })
       .into(image)
3
Nilesh Deokar

Android Studio 3.5-Kotlin 1.3.41-Glide 4.9.0

  • この依存関係をdependenciesの下のbuild.gradleに追加します。

    実装 'com.github.bumptech.glide:glide:4.9.0'

クラスの先頭に移動して、これらのインポートを追加します(kotlinターゲットクラスアノテーションとは異なるtargetクラスに特に注意してください)。

_import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.load.resource.gif.GifDrawable
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import Android.graphics.drawable.Drawable
import Android.support.graphics.drawable.Animatable2Compat
_

削除する必要がない場合は、override(600, 600)として追加のパラメーターをいくつか追加しました。

_// Start animation
        Glide
            .with(this)
            .load(R.drawable.tossina_pose1)
            .centerCrop()
            .override(600, 600)
            .placeholder(R.drawable.tossina_idle_0)
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .listener(object : RequestListener<Drawable> {
                override fun onLoadFailed(p0: GlideException?, p1: Any?, p2: Target<Drawable>?, p3: Boolean): Boolean {
                    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
                }
                override fun onResourceReady(p0: Drawable?, p1: Any?, p2: Target<Drawable>?, p3: DataSource?, p4: Boolean): Boolean {
                    (p0 as GifDrawable).setLoopCount(1)
                    p0.registerAnimationCallback(object : Animatable2Compat.AnimationCallback() {
                        override fun onAnimationEnd(drawable: Drawable) {
                            println("animation ends")
                        }
                    })
                    return false
                }
            })
            .into(img)
_

いくつかの指摘:_R.drawable.tossina_pose1_は私のGIFです。この例のようにgif​​ローカルイメージを配置することもできます。最後の行.into(img) have img that my my imageView

1

Bitmapを使用してImageViewGlideに設定するだけの場合は、 Extension Function inKotlinを使用すると、uri/url or sizeのようなパラメーターを渡すだけで済みます。

例:

class KotlinActivity : AppCompatActivity() {

    var sampleImageView : ImageView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_kotlin)
        sampleImageView = findViewById(R.id.imageView) as ImageView?
        sampleImageView?.setImage("https://kbob.github.io/images/sample-3.jpg")
    }

//Extension function for ImageView
    fun ImageView.setImage(url:String, context:Context){
        Glide.with(context).load(url).into(this)
    }
}