|
@@ -0,0 +1,129 @@
|
|
|
+package com.cooleshow.base.widgets;
|
|
|
+
|
|
|
+import android.content.Context;
|
|
|
+import android.graphics.drawable.Drawable;
|
|
|
+import android.text.Editable;
|
|
|
+import android.text.TextWatcher;
|
|
|
+import android.util.AttributeSet;
|
|
|
+import android.view.MotionEvent;
|
|
|
+import android.view.View;
|
|
|
+
|
|
|
+import com.cooleshow.base.R;
|
|
|
+import com.cooleshow.base.utils.SizeUtils;
|
|
|
+
|
|
|
+import androidx.appcompat.widget.AppCompatEditText;
|
|
|
+import androidx.core.content.ContextCompat;
|
|
|
+import androidx.core.graphics.drawable.DrawableCompat;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Author by pq, Date on 2023/2/15.
|
|
|
+ */
|
|
|
+public class ClearEditText extends AppCompatEditText implements View.OnTouchListener, View.OnFocusChangeListener, TextWatcher {
|
|
|
+
|
|
|
+ private Drawable mClearTextIcon;
|
|
|
+ private OnFocusChangeListener mOnFocusChangeListener;
|
|
|
+ private OnTouchListener mOnTouchListener;
|
|
|
+
|
|
|
+ public ClearEditText(final Context context) {
|
|
|
+ super(context);
|
|
|
+ init(context);
|
|
|
+ }
|
|
|
+
|
|
|
+ public ClearEditText(final Context context, final AttributeSet attrs) {
|
|
|
+ super(context, attrs);
|
|
|
+ init(context);
|
|
|
+ }
|
|
|
+
|
|
|
+ public ClearEditText(final Context context, final AttributeSet attrs, final int defStyleAttr) {
|
|
|
+ super(context, attrs, defStyleAttr);
|
|
|
+ init(context);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void init(final Context context) {
|
|
|
+ final Drawable drawable = ContextCompat.getDrawable(context, R.drawable.icon_clear_edit_content);
|
|
|
+ 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.getIntrinsicWidth(), mClearTextIcon.getIntrinsicHeight());
|
|
|
+ setClearIconVisible(false);
|
|
|
+ super.setOnTouchListener(this);
|
|
|
+ super.setOnFocusChangeListener(this);
|
|
|
+ addTextChangedListener(this);
|
|
|
+ setCompoundDrawablePadding(SizeUtils.dp2px(5));
|
|
|
+ setPadding(getPaddingLeft(),getPaddingTop(),getPaddingRight()+SizeUtils.dp2px(5),getPaddingBottom());
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void setOnFocusChangeListener(OnFocusChangeListener l) {
|
|
|
+ mOnFocusChangeListener = l;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void setOnTouchListener(OnTouchListener l) {
|
|
|
+ mOnTouchListener = l;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onFocusChange(View v, boolean hasFocus) {
|
|
|
+ if (hasFocus) {
|
|
|
+ setClearIconVisible(getText().length() > 0);
|
|
|
+ } else {
|
|
|
+ setClearIconVisible(false);
|
|
|
+ }
|
|
|
+ if (mOnFocusChangeListener != null) {
|
|
|
+ mOnFocusChangeListener.onFocusChange(v, hasFocus);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean onTouch(View view, 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(CharSequence text, int start, int lengthBefore, int lengthAfter) {
|
|
|
+ if (isFocused()) {
|
|
|
+ setClearIconVisible(text.length() > 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void afterTextChanged(Editable s) {
|
|
|
+ if (mTextWatchListener != null) {
|
|
|
+ mTextWatchListener.afterTextChanged(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]);
|
|
|
+ }
|
|
|
+
|
|
|
+ private OnTextWatchListener mTextWatchListener;
|
|
|
+
|
|
|
+ public void setTextWatchListener(OnTextWatchListener textWatchListener) {
|
|
|
+ mTextWatchListener = textWatchListener;
|
|
|
+ }
|
|
|
+
|
|
|
+ public interface OnTextWatchListener{
|
|
|
+ void afterTextChanged(Editable s);
|
|
|
+ }
|
|
|
+}
|