-
我们经常在一些应用中见到输入框带有删除功能,今天我们就来实现这个功能(文字组织能力不强,大家随便看看)。主要是记录一下自己的学习经历,如果对大家有帮助,我会更开心的。
先上图:
实现要点:
1、当输入框为空时,删除按钮隐藏;
2、当输入框不为空时,显示删除按钮。
核心代码:
001.
package
com.example.view;
002.
import
com.example.ui.R;
003.
import
android.content.Context;
004.
import
android.graphics.Rect;
005.
import
android.graphics.drawable.Drawable;
006.
import
android.text.Editable;
007.
import
android.text.TextWatcher;
008.
import
android.util.AttributeSet;
009.
import
android.view.MotionEvent;
010.
import
android.view.View;
011.
import
android.widget.EditText;
012.
import
android.widget.Toast;
013.
import
android.view.View.OnFocusChangeListener;;
014.
public
class
EditTextWithDelete
extends
EditText
implements
OnFocusChangeListener{
015.
private
Drawable imgEnable;
016.
private
Context context;
017.
018.
public
EditTextWithDelete(Context context) {
019.
super
(context);
020.
this
.context = context;
021.
init();
022.
}
023.
public
EditTextWithDelete(Context context, AttributeSet attrs,
int
defStyle) {
024.
super
(context, attrs, defStyle);
025.
this
.context = context;
026.
init();
027.
}
028.
public
EditTextWithDelete(Context context, AttributeSet attrs) {
029.
super
(context, attrs);
030.
this
.context = context;
031.
init();
032.
}
033.
034.
private
void
init() {
035.
//获取图片资源
036.
imgEnable = context.getResources().getDrawable(R.drawable.delete);
037.
addTextChangedListener(
new
TextWatcher() {
038.
039.
@Override
040.
public
void
onTextChanged(CharSequence s,
int
start,
int
before,
int
count) {
041.
042.
}
043.
044.
@Override
045.
public
void
beforeTextChanged(CharSequence s,
int
start,
int
count,
046.
int
after) {
047.
048.
}
049.
050.
@Override
051.
public
void
afterTextChanged(Editable s) {
052.
setDrawable();
053.
Toast.makeText(context, getText(),
10
).show();
054.
}
055.
});
056.
setDrawable();
057.
}
058.
059.
/**
060.
* 设置删除图片
061.
*/
062.
private
void
setDrawable() {
063.
if
(length() ==
0
) {
064.
setCompoundDrawablesWithIntrinsicBounds(
null
,
null
,
null
,
null
);
065.
}
else
{
066.
setCompoundDrawablesWithIntrinsicBounds(
null
,
null
, imgEnable,
null
);
067.
}
068.
}
069.
070.
/**
071.
* event.getX() 获取相对应自身左上角的X坐标
072.
* event.getY() 获取相对应自身左上角的Y坐标
073.
* getWidth() 获取控件的宽度
074.
* getTotalPaddingRight() 获取删除图标左边缘到控件右边缘的距离
075.
* getPaddingRight() 获取删除图标右边缘到控件右边缘的距离
076.
* getWidth() - getTotalPaddingRight() 计算删除图标左边缘到控件左边缘的距离
077.
* getWidth() - getPaddingRight() 计算删除图标右边缘到控件左边缘的距离
078.
*/
079.
@Override
080.
public
boolean
onTouchEvent(MotionEvent event) {
081.
if
(imgEnable !=
null
&& event.getAction() == MotionEvent.ACTION_UP) {
082.
int
x = (
int
) event.getX() ;
083.
//判断触摸点是否在水平范围内
084.
boolean
isInnerWidth = (x > (getWidth() - getTotalPaddingRight())) &&
085.
(x < (getWidth() - getPaddingRight()));
086.
//获取删除图标的边界,返回一个Rect对象
087.
Rect rect = imgEnable.getBounds();
088.
//获取删除图标的高度
089.
int
height = rect.height();
090.
int
y = (
int
) event.getY();
091.
//计算图标底部到控件底部的距离
092.
int
distance = (getHeight() - height) /
2
;
093.
//判断触摸点是否在竖直范围内(可能会有点误差)
094.
//触摸点的纵坐标在distance到(distance+图标自身的高度)之内,则视为点中删除图标
095.
boolean
isInnerHeight = (y > distance) && (y < (distance + height));
096.
097.
if
(isInnerWidth && isInnerHeight) {
098.
setText(
""
);
099.
}
100.
101.
}点击打开链接
102.
103.
return
super
.onTouchEvent(event);
104.
}
105.
106.
@Override
107.
protected
void
finalize()
throws
Throwable {
108.
super
.finalize();
109.
}
110.
@Override
111.
public
void
onFocusChange(View v,
boolean
hasFocus) {
112.
if
(hasFocus) {
113.
setDrawable();
114.
}
else
{
115.
setCompoundDrawablesWithIntrinsicBounds(
null
,
null
,
null
,
null
);
116.
}
117.
}
118.
119.
}
代码注释很清楚,相信以大家的水平都会看的懂的。在这边,我就不多做解释了。如果有不明白的,可以给我留言,大家交流交流。
自定义带删除功能的EditText
最新推荐文章于 2018-01-04 14:54:00 发布