前言
对于普通的编辑框,它的功能就是负责接收用户输入的信息,在实际开发中,常常会有这样的设计,就是在输入内容后,编辑框的内部右侧会出现一个删除按钮,点击后会清空编辑框里的内容,这样的交互是极好的,那这又是怎么实现的呢?
解决思路毫无疑问是——继承自EditText,自定义文本编辑框
为EditText设置addTextChangeListener
- 创建内部类实现TextWatcher接口,监听输入框文本的变化
- 改写onTouchEvent事件,点击叉号位置,清空文本
- 通过setCompoundDrawablesWithIntrinsicBounds方法为EditText设置图片
- 提示,先准备一张png的图片,由于EditText是继承自TextView的,因此也有setCompoundDrawablesWithIntrinsicBounds方法。
自定义EditTextWithDel类
继承自EditText,重写构造函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public EditTextWithDel(Context context) { super(context); mContext = context; init(); } public EditTextWithDel(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; init(); } public EditTextWithDel(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mContext = context; init(); }
|
监听文本是否改变的事件
1 2 3 4 5
| private void init() { imgInable = mContext.getResources().getDrawable(R.drawable.delete_grey); addTextChangedListener(new EditTextWatcher()); setDrawable(); }
|
创建内部类实现TextWatcher接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| private class EditTextWatcher implements TextWatcher { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { setDrawable(); } }
|
重写onTouchEvent事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Override public boolean onTouchEvent(MotionEvent event) { if (imgInable != null && event.getAction() == MotionEvent.ACTION_UP) { int eventX = (int) event.getRawX(); int eventY = (int) event.getRawY(); Log.e(TAG, "eventX = " + eventX + "; eventY = " + eventY); Rect rect = new Rect(); getGlobalVisibleRect(rect); rect.left = rect.right - 100; if (rect.contains(eventX, eventY)) { setText(""); } } return super.onTouchEvent(event); }
|
设置叉号视图
1 2 3 4 5 6 7 8
| private void setDrawable() { if (length() < 1) { setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); } else { setCompoundDrawablesWithIntrinsicBounds(null, null, imgInable, null); } }
|
其实也很简单,就是判断文本框内容的长度,长度超过1的就设置叉号视图,小于1的就设置为null。
希望本文对您有所帮助!
If you like my article, you can reward me to support my writing.

wechat

alipay