Обработка щелчка события в отрисовке внутри EditText

Я добавил изображение справа от текста в виджет 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" />

Но я хочу очистить EditText при нажатии на встроенное изображение. Как я могу это сделать?

229
задан logeshpalani98 1 August 2019 в 03:18
поделиться

1 ответ

Учтите следующее. Это не самое элегантное решение, но оно работает, я только что проверил его.

  1. Создайте настраиваемый класс EditText CustomEditText.java:

    import android.content.Context;
    импортировать android.graphics.Rect;
    импортировать android.graphics.drawable.Drawable;
    импортировать android.util.AttributeSet;
    импортировать android.view.MotionEvent;
    импортировать android.widget.Редактировать текст;
    открытый класс CustomEditText расширяет EditText
    {
    частное право на выдвижение;
    частные прямоугольники rBounds;
    
    public CustomEditText (контекст контекста, атрибуты AttributeSet, int defStyle) {
    супер(контекст, атрибуты, стиль определения);
     }
    public CustomEditText (контекст контекста, атрибуты AttributeSet) {
    супер(контекст, атрибуты);
     }
    public CustomEditText (контекст контекста) {
    супер(контекст);
     }
    
     @Override
    public void setCompoundDrawables (рисуемый слева, рисуемый сверху,
    Drawable справа, Drawable снизу)
     {
    если (правильно! = ноль)
     {
    dПраво = правильно;
     }
    super.setCompoundDrawables (слева, сверху, справа, снизу);
     }
    
     @Override
    общественное логическое значение onTouchEvent (событие MotionEvent)
     {
    
    if(event.getAction() == MotionEvent.ACTION_UP && dRight!=null)
     {
    rBounds = dRight.getBounds();
    окончательный int x = (int)event.getX();
    окончательный int y = (int)event.getY();
     //System.out.println("x:/y: "+x+"/"+y);
     //System.out.println("bounds: "+bounds.left+"/"+bounds.right+"/"+bounds.top+"/"+bounds.bottom);
     //проверить, чтобы событие касания находилось в пределах отрисовываемого
    if(x>=(this.getRight()-rBounds.width()) && x<=(this.getRight()-this.getPaddingRight())
     && y>=this.getPaddingTop() && y<=(this.getHeight()-this.getPaddingBottom()))
     {
     //System.out.println("touch");
    этот.setText("");
    event.setAction(MotionEvent.ACTION_CANCEL);//используйте это, чтобы предотвратить появление клавиатуры
     }
     }
    вернуть super.onTouchEvent (событие);
     }
    
     @Override
    protected void finalize() выбрасывает Throwable
     {
    dRight = ноль;
    rBounds = ноль;
    супер.финализировать();
     }
    }
    
  2. Измените XML макета на этот (где com.example — ваше фактическое имя пакета проекта):

    
    
  3. Наконец, добавьте это (или что-то подобное) в свою активность:

    …
    CustomEditText et = (CustomEditText) this.findViewById(R.id.txtsearch);
    …
    

Возможно, я немного ошибся с расчетом границ касания для вложенных рисунков, но вы поняли идею.

Надеюсь, это поможет.

29
ответ дан 23 November 2019 в 03:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: