web-dev-qa-db-fra.com

Rappel de Glide après un succès à 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);
}

J'ai essayé de le convertir en Kotlin comme suit.

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)

Mais l'erreur de compilation montre que

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

Merci de bien vouloir m'aider à résoudre ce problème.

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)

Avec Glide, vous pouvez ajouter Listener à votre chaîne, qui surveille l'état du chargement de votre image. Vous devez remplacer deux méthodes, dans la méthode onResourceReady vous rappelez que votre image est déjà chargée et vous pouvez faire quelque chose, par exemple masquer le chargeur ou laisser terminer l'animation à partir d'une autre vue. Dans onLoadFailed vous obtenez des informations sur une erreur lors du chargement et vous pouvez également réagir d'une manière ou d'une autre. De cette façon, vous pouvez éviter ces erreurs.

5
Paulina

Le problème est que dans le Java, vous avez utilisé le type SimpleTarget comme type de target. Il s'agit d'un type brut (paramètres génériques manquants), et est l'un des gros problèmes hérités des génériques Java. Kotlin n'autorise pas les types bruts, et c'est pourquoi vous avez rencontré des problèmes lors de la conversion.

Pour résoudre ce problème, vous devez procéder comme suit en Java:

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

Ce qui vous obligera à ajouter asBitmap() à votre appel Glide:

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

Maintenant que votre code utilise des génériques en toute sécurité, il peut être traduit en Kotlin sans problème:

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

Pour ceux qui utilisent 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

  • ajoutez cette dépendance à votre build.gradle sous dependencies:

    implémentation 'com.github.bumptech.glide: glide: 4.9.0'

Allez en haut de votre classe et ajoutez ces importations (faites particulièrement attention à la classe target qui est différente de l'annotation de la classe cible kotlin):

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

J'ai mis un paramètre supplémentaire comme override(600, 600), si vous n'avez pas besoin de le supprimer ..

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

Quelques indications: R.drawable.tossina_pose1 Est mon GIF, vous pouvez aussi mettre une image locale gif comme cet exemple. La dernière ligne .into(img) a img qui est mon imageView

1
Alessandro Ornano

Si vous souhaitez uniquement définir le Bitmap dans le ImageView en utilisant Glide, vous pouvez essayer un Fonction d'extension in Kotlin avec lequel vous n'aurez qu'à passer les paramètres comme uri/url or size.

Par exemple:

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