使用 Glide 在 MenuItem 中加载远程图像
Load a remote image in a MenuItem using Glide
通常,如果我想用 Glide 加载图像,我会写以下内容:
Glide.with(context)
.load(theURLOftheImage)
.error(R.drawable.ic_error_image)
.into(theImageView);
但是如果我需要将 URL 的图像加载到必须实时更改的 MenuItem 中怎么办?
以下是不可能的,因为方法into
不接受参数:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem settingsItem = menu.findItem(R.id.actionbar_menu_profile_actions);
if (changeImage) {
Glide.with(this).load(theURLOftheImage).error(R.drawable.ic_error_image).into(settingsItem);
}
return super.onPrepareOptionsMenu(menu);
}
使用 this question 的回复中建议的方法行之有效
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem settingsItem = menu.findItem(R.id.actionbar_menu_profile_actions);
if (changeImage) {
Glide.with(this).asBitmap().load(theURLOfTheImage).into(new SimpleTarget<Bitmap>(100,100) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
settingsItem.setIcon(new BitmapDrawable(getResources(), resource));
}
});
}
return super.onPrepareOptionsMenu(menu);
}
我的一个代码填充 BottomNavigationView 的另一种方法:
...
bottomNavigationView = findViewById(R.id.bottomNavigationView);
if(bottomNavigationView != null) {
bottomNavigationView.inflateMenu(R.menu.bottom_main_menu);
Menu bottomMenu = bottomNavigationView.getMenu();
//bottomMenu.removeItem(0);
final MenuItem menuItem = bottomMenu.add("Test 95");
Glide
.with(this)
.load("https:// <add your image resource link here>")
.into(new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
menuItem.setIcon(resource);
}
});
}
...
记得在应用程序中添加正确的 Glide 版本 gradle,4.7.1 应该适用于此版本:
implementation 'com.github.bumptech.glide:glide:4.7.1'
由于 SimpleTarget 已被弃用,因此针对此页面的用户还有其他解决方案。
Glide
.with(activity)
.load(path)
.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
.centerCrop()
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
menuItem.setIcon(resource);
return false;
}
});
通常,如果我想用 Glide 加载图像,我会写以下内容:
Glide.with(context)
.load(theURLOftheImage)
.error(R.drawable.ic_error_image)
.into(theImageView);
但是如果我需要将 URL 的图像加载到必须实时更改的 MenuItem 中怎么办?
以下是不可能的,因为方法into
不接受参数:
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem settingsItem = menu.findItem(R.id.actionbar_menu_profile_actions);
if (changeImage) {
Glide.with(this).load(theURLOftheImage).error(R.drawable.ic_error_image).into(settingsItem);
}
return super.onPrepareOptionsMenu(menu);
}
使用 this question 的回复中建议的方法行之有效
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem settingsItem = menu.findItem(R.id.actionbar_menu_profile_actions);
if (changeImage) {
Glide.with(this).asBitmap().load(theURLOfTheImage).into(new SimpleTarget<Bitmap>(100,100) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
settingsItem.setIcon(new BitmapDrawable(getResources(), resource));
}
});
}
return super.onPrepareOptionsMenu(menu);
}
我的一个代码填充 BottomNavigationView 的另一种方法:
...
bottomNavigationView = findViewById(R.id.bottomNavigationView);
if(bottomNavigationView != null) {
bottomNavigationView.inflateMenu(R.menu.bottom_main_menu);
Menu bottomMenu = bottomNavigationView.getMenu();
//bottomMenu.removeItem(0);
final MenuItem menuItem = bottomMenu.add("Test 95");
Glide
.with(this)
.load("https:// <add your image resource link here>")
.into(new SimpleTarget<Drawable>() {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
menuItem.setIcon(resource);
}
});
}
...
记得在应用程序中添加正确的 Glide 版本 gradle,4.7.1 应该适用于此版本:
implementation 'com.github.bumptech.glide:glide:4.7.1'
由于 SimpleTarget 已被弃用,因此针对此页面的用户还有其他解决方案。
Glide
.with(activity)
.load(path)
.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
.centerCrop()
.listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
menuItem.setIcon(resource);
return false;
}
});