返回

如何在 EditText 中清除点击可绘制图片后的文本?

Android

## 在 EditText 中捕获可绘制图片的点击事件

### 问题

如何在 EditText 中捕获可绘制图片的点击事件?单击图片时,我们希望清除 EditText 中的文本。

### 解决方法

步骤 1:定义 DrawableClickListener 类

public class DrawableClickListener implements View.OnClickListener {
    private EditText editText;

    public DrawableClickListener(EditText editText) {
        this.editText = editText;
    }

    @Override
    public void onClick(View v) {
        editText.setText("");
    }
}

步骤 2:在 onAttachedToWindow 方法中设置监听器

@Override
protected void onAttachedToWindow() {
    super.onAttachedToWindow();

    Drawable[] drawables = editText.getCompoundDrawables();
    if (drawables[2] != null) {
        drawables[2].setCallback(new Drawable.Callback() {
            @Override
            public void invalidateDrawable(Drawable who) {
                invalidate();
            }

            @Override
            public void scheduleDrawable(Drawable who, Runnable what, long when) {
                scheduleInvalidate();
            }

            @Override
            public void unscheduleDrawable(Drawable who, Runnable what) {
                unscheduleInvalidate();
            }
        });

        drawables[2].setOnClickListener(new DrawableClickListener(editText));
    }
}

### 更新 XML 布局

<EditText
  android:id="@+id/txtsearch"
  ...
  android:layout_gravity="center_vertical"
  android:background="@layout/shape"
  android:hint="Enter place,city,state"
  android:drawableRight="@drawable/cross" />

### 工作原理

  • DrawableClickListener 类实现了 OnClickListener 接口,并在单击时清除 EditText 的文本。
  • onAttachedToWindow 方法获取 EditText 中的可绘制图片,并设置 DrawableClickListener 作为其单击监听器。
  • 设置图片的 Callback 允许它接收事件,并确保即使图像大小发生变化也能触发单击事件。

### 代码示例

EditText editText = findViewById(R.id.txtsearch);
Drawable[] drawables = editText.getCompoundDrawables();
if (drawables[2] != null) {
    drawables[2].setCallback(new Drawable.Callback() {
        @Override
        public void invalidateDrawable(Drawable who) {
            invalidate();
        }

        @Override
        public void scheduleDrawable(Drawable who, Runnable what, long when) {
            scheduleInvalidate();
        }

        @Override
        public void unscheduleDrawable(Drawable who, Runnable what) {
            unscheduleInvalidate();
        }
    });

    drawables[2].setOnClickListener(new DrawableClickListener(editText));
}

### 提示

  • 此解决方案只适用于右侧可绘制图片。要处理其他方向的可绘制图片,你需要修改代码以获取相应的 Drawable
  • 确保在布局文件中正确设置 android:drawableRight,否则此解决方案将不起作用。

### 常见问题解答

  1. 为什么不能在布局文件中使用 android:onClick 来处理点击事件?
    android:onClick 无法处理可绘制图片的点击事件。

  2. 如何捕获其他方向的可绘制图片的点击事件?
    修改 onAttachedToWindow 方法以获取相应的 Drawable,例如:

    if (drawables[0] != null) {
        // 左侧可绘制图片
    } else if (drawables[1] != null) {
        // 顶部可绘制图片
    } else if (drawables[3] != null) {
        // 底部可绘制图片
    }
    
  3. 如何获取可绘制图片的边界?
    你可以使用 getCompoundDrawablePadding() 方法获取图片与文本之间的内边距。

  4. 如何更改可绘制图片的大小?
    你可以使用 setCompoundDrawablesWithIntrinsicBounds() 方法更改图片的大小。

  5. 如何禁用可绘制图片的点击事件?
    你可以使用 setClickable(false) 方法禁用图片的点击事件。