如何将服务器图片设为EditText背景?Glide加载后设置无效求解决
解决Glide加载网络图片设置为EditText背景无效的问题
我明白你遇到的困扰了——本地Drawable设置EditText背景很简单,但用Glide加载网络图片后,想把它设为EditText背景却没成功。之前尝试的onResourceReady直接设置的方法无效,大概率是因为Glide返回的Drawable和ImageView绑定了状态,或者尺寸适配没做好,咱们来一步步解决。
可能的原因
Glide加载返回的Drawable通常是经过包装的(比如Glide自定义的Drawable或者绑定了ImageView的BitmapDrawable),直接设置给EditText时,要么因为Drawable的状态被占用无法复用,要么因为尺寸不匹配导致看不到效果。
解决方案一:点击时重新加载并设置背景
这种方法最直接,避免复用ImageView的Drawable,在点击事件里单独加载图片并设置给EditText:
img_1.setOnClickListener(v -> { Glide.with(this) .load(API_BASE_URL + "img/post_wall_background_1.jpg") .apply(RequestOptions.bitmapTransform(new RoundedCorners(15))) .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) { // 转换成BitmapDrawable并设置适配模式 if (resource instanceof BitmapDrawable) { Bitmap bitmap = ((BitmapDrawable) resource).getBitmap(); BitmapDrawable backgroundDrawable = new BitmapDrawable(getResources(), bitmap); // 根据需求设置缩放模式:CLAMP(拉伸填充)/ REPEAT(重复)/ MIRROR(镜像重复) backgroundDrawable.setTileModeXY(Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); new_post_edit_text.setBackground(backgroundDrawable); } return false; } }) .preload(); // 使用preload而非into,因为不需要加载到ImageView });
解决方案二:缓存加载好的Drawable,点击时复用
如果不想重复请求网络,可以在第一次加载时缓存Drawable,注意要拷贝或解除与ImageView的绑定:
// 类成员变量缓存Drawable private Drawable cachedBackground; // 初始加载图片的代码 Glide.with(img_1) .load(API_BASE_URL + "img/post_wall_background_1.jpg") .apply(RequestOptions.bitmapTransform(new RoundedCorners(15))) .placeholder(R.drawable.shadow) .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) { // 拷贝Drawable避免与ImageView绑定 if (resource instanceof BitmapDrawable) { Bitmap bitmap = ((BitmapDrawable) resource).getBitmap(); // 拷贝Bitmap创建新的Drawable cachedBackground = new BitmapDrawable(getResources(), bitmap.copy(Bitmap.Config.ARGB_8888, true)); } else { // 对非BitmapDrawable调用mutate()解除共享状态 cachedBackground = resource.mutate(); } return false; } }) .into(img_1); // 点击事件设置背景 img_1.setOnClickListener(v -> { if (cachedBackground != null) { if (cachedBackground instanceof BitmapDrawable) { ((BitmapDrawable) cachedBackground).setTileModeXY(Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); } new_post_edit_text.setBackground(cachedBackground); } });
额外注意事项
- 记得给EditText设置合适的padding,避免文字被背景遮挡;
- 如果你的Glide版本较低(比如3.x),返回的是
GlideDrawable,需要先转换成BitmapDrawable再处理; - 缩放模式可以根据你的需求调整,比如背景图较小的话用
REPEAT重复填充。
内容的提问来源于stack exchange,提问作者ankalagba




