Glide-4.0.0 Missing placeholder, error, GlideApp and does not resolve its method placeholder,error
AndroidAndroid LayoutAndroid GlideAndroid Problem Overview
I want to use the Glide Android library to download an image and show in ImageView
.
In the previous version we used:
Glide.with(mContext).load(imgUrl)
.thumbnail(0.5f)
.placeholder(R.drawable.PLACEHOLDER_IMAGE_NAME)
.error(R.drawable.ERROR_IMAGE_NAME)
.crossFade()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(imageView);
But I have seen Glide documentation:
> it says use GlideApp.with()
instead Glide.with()
My concern is a missing placeholder, error, GlideApp, and other options.
I am using
compile 'com.github.bumptech.glide:glide:4.0.0'
Where am I doing wrong? With reference to here.
How has GlideApp.with()
been used?
The API is generated in the same package as the AppGlideModule
and is named GlideApp
by default. Applications can use the API by starting all loads with GlideApp.with()
instead of Glide.with()
:
GlideApp.with(fragment)
.load(myUrl)
.placeholder(placeholder)
.fitCenter()
.into(imageView);
Android Solutions
Solution 1 - Android
Try using RequestOptions:
RequestOptions requestOptions = new RequestOptions();
requestOptions.placeholder(R.drawable.ic_placeholder);
requestOptions.error(R.drawable.ic_error);
Glide.with(context)
.setDefaultRequestOptions(requestOptions)
.load(url).into(holder.imageView);
EDIT
If .setDefaultRequestOptions(requestOptions)
does not work, use .apply(requestOptions)
:
Glide.with(MainActivity.this)
.load(url)
.apply(requestOptions)
.into(imageview);
// or this
Glide.with(MainActivity.this)
.load(url)
.apply(new RequestOptions().placeholder(R.drawable.booked_circle).error(R.drawable.booked_circle))
.into(imageview);
// or this
Glide.with(MainActivity.this)
.load(url)
.apply(RequestOptions.placeholderOf(R.drawable.booked_circle).error(R.drawable.))
.into(imageview);
EDIT 2 Bonus
Here are some other changes in Glide-4
- How to use
requestOptions.circleCropTransform();
- How to use
Cross fades()
- How to use
GlideDrawableImageViewTarget
in Glide-4 - How to use
GifDrawable
as target parameter
Solution 2 - Android
If you use Glide package dependencies, compile 'com.github.bumptech.glide:glide:3.7.0'
, then use should be to use the below code:
GlideApp
.with(your context)
.load(url)
.centerCrop()
.placeholder(R.drawable.loading_image)
.error(R.drawable.error_image)
.into(myImageView);
> Note: As in the documentation, > > Round Pictures: CircleImageView/CircularImageView/RoundedImageView are > known to have issues with TransitionDrawable (.crossFade() with > .thumbnail() or .placeholder()) and animated GIFs, use a > BitmapTransformation (.circleCrop() will be available in v4) or > .dontAnimate() to fix the issue.
The latest updated version compile com.github.bumptech.glide:glide:4.1.1
then use should be to use the below code:
RequestOptions options = new RequestOptions()
.centerCrop()
.placeholder(R.drawable.default_avatar)
.error(R.drawable.default_avatar)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.priority(Priority.HIGH)
.dontAnimate()
.dontTransform();
Glide.with(this)
.load(url)
.apply(options)
.into(imageView);
See the latest version of glide, bug fixes and features.
Solution 3 - Android
If you want to use GlideApp you have to add to dependencies
annotation processor like on the screenshot:
Then include an AppGlideModule implementation in your application:
@GlideModule
public final class MyAppGlideModule extends AppGlideModule {}
Do not forget about the @GlideModule
annotation.
Then you need to Build project. And GlideApp
will be automatically generated.
Solution 4 - Android
Dependencies:
compile 'com.github.bumptech.glide:glide:4.1.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.1.1'
Add an appropriately annotated AppGlideModule implementation:
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;
@GlideModule
public final class MyAppGlideModule extends AppGlideModule{}
In addition, if you have used the jack option, in order to avoid the following similar errors, you need use Android Studio 3.0.0 preview.
> Error:Execution failed for task ':app:transformJackWithJackForDebug'. > com.android.jack.ir.JNodeInternalError: java.lang.Exception: java.lang.AssertionError: No yet implemented
Solution 5 - Android
We have no need to use RequestOptions also.
The generated API adds a GlideApp class, that provides access to RequestBuilder and RequestOptions subclasses. The RequestOptions subclass contains all methods in RequestOptions and any methods defined in GlideExtensions. The RequestBuilder subclass provides access to all methods in the generated RequestOptions subclass without having to use apply:
Using Glide :-
A request without the generated API might look like this:
Glide.with(fragment)
.load(url)
.apply(centerCropTransform()
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.priority(Priority.HIGH))
.into(imageView);
Using GlideApp :-
With the generated API, the RequestOptions
calls can be inlined:
GlideApp.with(fragment)
.load(url)
.centerCrop()
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.priority(Priority.HIGH)
.into(imageView);
You can still use the generated RequestOptions subclass to apply the same set of options to multiple loads, but generated RequestBuilder subclass may be more convenient in most cases.
Solution 6 - Android
Working
Glide.with(context!!)
.load(user.profileImage)
.apply (RequestOptions.placeholderOf(R.drawable.dummy_user))
.into(edit_profile_image)
Solution 7 - Android
If you want to use a common placeholder everywhere in your app then you can do it like this way:
As we are creating GlideModule from Glide v4, you can copy/paste this class in your project so you will able to use GlideApp class (for more steps - follow this):
@GlideModule
public class SampleGlideModule extends AppGlideModule {
@Override
public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
super.applyOptions(context, builder);
builder.setDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.logo).error(R.drawable.logo));
}
@Override
public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
super.registerComponents(context, glide, registry);
}
}
You can give all the request options here to set as default.
By creating this class you do not need to use .placeholder
with GlideApp
, it will be applied automatically.
Solution 8 - Android
RequestOptions options = new RequestOptions()
.placeholder(R.drawable.null_image_profile)
.error(R.drawable.null_image_profile);
//.centerCrop()
//.diskCacheStrategy(DiskCacheStrategy.ALL)
//.priority(Priority.HIGH);
Glide.with(context).load(imageUrl)
.apply(options)
.into(profileImage);