之前项目里EditText删除功能都是通过在EditText后面加一个View实现的,但是最近项目里的EditText 看上去酷炫,加了android.support.design.widget.TextInputLayout
所以必须得重写一个EidtText了
下面是重写EditText ClearableEditText类的代码
public class ClearableEditText extends EditText implements OnTouchListener, OnFocusChangeListener, TextWatcherListener {
public enum Location {
LEFT(0), RIGHT(2);
final int idx;
Location(int idx) {
this.idx = idx;
}
}
public interface Listener {
void didClearText();
}
public ClearableEditText(Context context) {
super(context);
init();
}
public ClearableEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ClearableEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public void setListener(Listener listener) {
this.listener = listener;
}
/**
* null disables the icon
*/
public void setIconLocation(Location loc) {
this.loc = loc;
initIcon();
}
@Override
public void setOnTouchListener(OnTouchListener l) {
this.l = l;
}
@Override
public void setOnFocusChangeListener(OnFocusChangeListener f) {
this.f = f;
}
private Location loc = Location.RIGHT;
private Drawable xD;
private Listener listener;
private OnTouchListener l;
private OnFocusChangeListener f;
@Override
public boolean onTouch(View v, MotionEvent event) {
if (getDisplayedDrawable() != null) {
int x = (int) event.getX();
int y = (int) event.getY();
int left = (loc == Location.LEFT) ? 0 : getWidth() - getPaddingRight() - xD.getIntrinsicWidth();
int right = (loc == Location.LEFT) ? getPaddingLeft() + xD.getIntrinsicWidth() : getWidth();
boolean tappedX = x >= left && x <= right && y >= 0 && y <= (getBottom() - getTop());
if (tappedX) {
if (event.getAction() == MotionEvent.ACTION_UP) {
setText("");
if (listener != null) {
listener.didClearText();
}
}
return true;
}
}
if (l != null) {
return l.onTouch(v, event);
}
return false;
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
setClearIconVisible(StringU.isNotEmpty(getText().toString()));
} else {
setClearIconVisible(false);
}
if (f != null) {
f.onFocusChange(v, hasFocus);
}
}
@Override
public void onTextChanged(EditText view, String text) {
if (isFocused()) {
setClearIconVisible(StringU.isNotEmpty(text));
}
}
@Override
public void setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom) {
super.setCompoundDrawables(left, top, right, bottom);
initIcon();
}
private void init() {
super.setOnTouchListener(this);
super.setOnFocusChangeListener(this);
addTextChangedListener(new TextWatcherAdapter(this, this));
initIcon();
setClearIconVisible(false);
}
private void initIcon() {
xD = null;
if (loc != null) {
xD = getCompoundDrawables()[loc.idx];
}
if (xD == null) {
xD = getResources().getDrawable(android.R.drawable.presence_offline);
}
xD.setBounds(0, 0, xD.getIntrinsicWidth(), xD.getIntrinsicHeight());
int min = getPaddingTop() + xD.getIntrinsicHeight() + getPaddingBottom();
if (getSuggestedMinimumHeight() < min) {
setMinimumHeight(min);
}
}
private Drawable getDisplayedDrawable() {
return (loc != null) ? getCompoundDrawables()[loc.idx] : null;
}
protected void setClearIconVisible(boolean visible) {
Drawable[] cd = getCompoundDrawables();
Drawable displayed = getDisplayedDrawable();
boolean wasVisible = (displayed != null);
if (visible != wasVisible) {
Drawable x = visible ? xD : null;
super.setCompoundDrawables((loc == Location.LEFT) ? x : cd[0], cd[1], (loc == Location.RIGHT) ? x : cd[2],
cd[3]);
}
}
}
其中StringU的 isNotEmpty()方法如下
public static boolean isNotEmpty(CharSequence str) {
return !isEmpty(str);
}
public static boolean isEmpty(CharSequence str) {
return str == null || str.length() == 0;
}
重写一下 TextWatcher类 TextWatcherAdapter
public class TextWatcherAdapter implements TextWatcher {
public interface TextWatcherListener {
void onTextChanged(EditText view, String text);
}
private final EditText view;
private final TextWatcherListener listener;
public TextWatcherAdapter(EditText editText, TextWatcherListener listener) {
this.view = editText;
this.listener = listener;
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
listener.onTextChanged(view, s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// pass
}
@Override
public void afterTextChanged(Editable s) {
// pass
}
}
网友评论