针对edittex添加图标,对非图标区域点击事件处理

在工作中经常遇到一些小问题,总爱忘记,特此记录以备以后翻阅。

对于EditText控件,添加图标,如图点击删除图标,内容清楚,不弹出时间控件,点击非删除按钮区域,则弹出时间控件

针对edittex添加图标,对非图标区域点击事件处理

一、要实现图上效果有很多方式:

1、放一个EditText,再放一个Button

2、自定义一个EditText,Right放一个图标

第一种就不说了,无非就是模拟出来那种效果,直接说第二种。

自定义EditText,下面是主要的事件逻辑

// 输入事件处理
@Override
public boolean onTouchEvent(MotionEvent event) {
    if (mRight != null && event.getAction() == MotionEvent.ACTION_UP) {
        this.mBounds = mRight.getBounds();
        mRight.getIntrinsicWidth();
        int eventX = (int) event.getX();
        int width = mBounds.width();
        int right = getRight();
        int left = getLeft();
        if (eventX > (right - width * 2 - left)) {
            setText("");
            event.setAction(MotionEvent.ACTION_CANCEL);
        }
    }
}
onTouchEvent为EditText控件的事件,但主要是用来控制删除按钮,点击删除按钮实现的效果是由点击位置来决定的,从上面代码可以看出来,我们通过点击的位置是否属于删除按钮的位置范围,来决定是否点击了删除按钮,event.getX()为点击的位置,mBounds.width()为删除按钮的宽度,getRight()为EditText控件右边界对于父控件的位置,getLeft()则为左边界位置,因此我们可以得出,删除按钮对于父控件的起始位置=right-width-left就为相对于父控件的位置,到这里上面事件就完成了。
二、完成时间控件的控制
这一步主要完成点击控制弹出时间控件就OK了,那相应的代码就如下,代码很普通,就不多加注释了。

//开始时间选择
statics_search_begin_time_et.setText(datefmtDate
        .format(dateAndTime.getTime()));
statics_search_begin_time_et.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
	//获取删除图标
        Drawable drawable = statics_search_begin_time_et.getCompoundDrawables()[2];
        if (event.getX() < statics_search_begin_time_et.getWidth() - statics_search_begin_time_et.getPaddingRight() - (drawable == null ? 0 : drawable.getIntrinsicWidth()) && event.getAction() == MotionEvent.ACTION_UP) {
            DatePickerDialog datePickerDialog = new DatePickerDialog(
                    mContext, new DatePickerDialog.OnDateSetListener() {
                public void onDateSet(DatePicker paramDatePicker,
                                      int paramInt1, int paramInt2, int paramInt3) {
                    dateAndTime.set(Calendar.YEAR, paramInt1);
                    dateAndTime.set(Calendar.MONTH, paramInt2);
                    dateAndTime.set(Calendar.DAY_OF_MONTH,
                            paramInt3);
                    statics_search_begin_time_et.setText(datefmtDate
                            .format(dateAndTime.getTime()));
                    beginTime = statics_search_begin_time_et.getText().toString();
                }
            }, year, month, day);
            datePickerDialog.setTitle("开始日期");
            datePickerDialog.show();
        }
        return false;
    }
});