You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将服务器图片设为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

火山引擎 最新活动