Last active
May 18, 2016 10:22
-
-
Save BlinkoWang/e41ef3aa574a30f54b5922f32025c38a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import android.content.Context; | |
import android.graphics.drawable.Drawable; | |
import android.support.v4.content.ContextCompat; | |
import android.support.v4.graphics.drawable.DrawableCompat; | |
import android.text.Editable; | |
import android.text.TextWatcher; | |
import android.util.AttributeSet; | |
import android.view.MotionEvent; | |
import android.view.View; | |
import android.widget.EditText; | |
public class ClearableEditText extends EditText implements View.OnTouchListener, View.OnFocusChangeListener, TextWatcher { | |
private Drawable mClearTextIcon; | |
private OnFocusChangeListener mOnFocusChangeListener; | |
private OnTouchListener mOnTouchListener; | |
public ClearableEditText(final Context context) { | |
this(context, null); | |
} | |
public ClearableEditText(final Context context, final AttributeSet attrs) { | |
this(context, attrs, 0); | |
} | |
public ClearableEditText(final Context context, final AttributeSet attrs, final int defStyleAttr) { | |
super(context, attrs, defStyleAttr); | |
init(context); | |
} | |
@Override | |
public void setOnFocusChangeListener(final OnFocusChangeListener onFocusChangeListener) { | |
mOnFocusChangeListener = onFocusChangeListener; | |
} | |
@Override | |
public void setOnTouchListener(final OnTouchListener onTouchListener) { | |
mOnTouchListener = onTouchListener; | |
} | |
private void init(final Context context) { | |
final Drawable drawable = ContextCompat.getDrawable(context, R.drawable.btn_icosearch_delete_v5); | |
final Drawable wrappedDrawable = DrawableCompat.wrap(drawable); //Wrap the drawable so that it can be tinted pre Lollipop | |
DrawableCompat.setTint(wrappedDrawable, getCurrentHintTextColor()); | |
mClearTextIcon = wrappedDrawable; | |
mClearTextIcon.setBounds(0, 0, mClearTextIcon.getIntrinsicHeight(), mClearTextIcon.getIntrinsicHeight()); | |
setClearIconVisible(false); | |
super.setOnTouchListener(this); | |
super.setOnFocusChangeListener(this); | |
addTextChangedListener(this); | |
} | |
@Override | |
public void onFocusChange(final View view, final boolean hasFocus) { | |
if (hasFocus && isEnabled()) { | |
setClearIconVisible(getText().length() > 0); | |
} else { | |
setClearIconVisible(false); | |
} | |
if (mOnFocusChangeListener != null) { | |
mOnFocusChangeListener.onFocusChange(view, hasFocus); | |
} | |
} | |
@Override | |
public boolean dispatchTouchEvent(MotionEvent event) { | |
return isEnabled() && super.dispatchTouchEvent(event); | |
} | |
@Override | |
public boolean onTouch(final View view, final MotionEvent motionEvent) { | |
final int x = (int) motionEvent.getX(); | |
if (mClearTextIcon.isVisible() && x > getWidth() - getPaddingRight() - mClearTextIcon.getIntrinsicWidth()) { | |
if (motionEvent.getAction() == MotionEvent.ACTION_UP) { | |
setError(null); | |
setText(""); | |
} | |
return true; | |
} | |
return mOnTouchListener != null && mOnTouchListener.onTouch(view, motionEvent); | |
} | |
@Override | |
public final void onTextChanged(final CharSequence s, final int start, final int before, final int count) { | |
if (isFocused() && isEnabled()) { | |
setClearIconVisible(s.length() > 0); | |
} | |
} | |
@Override | |
public void beforeTextChanged(CharSequence s, int start, int count, int after) { | |
} | |
@Override | |
public void afterTextChanged(Editable s) { | |
} | |
private void setClearIconVisible(final boolean visible) { | |
mClearTextIcon.setVisible(visible, false); | |
final Drawable[] compoundDrawables = getCompoundDrawables(); | |
setCompoundDrawables( | |
compoundDrawables[0], | |
compoundDrawables[1], | |
visible ? mClearTextIcon : null, | |
compoundDrawables[3]); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment