美文网首页
带删除按钮的自定义EditText

带删除按钮的自定义EditText

作者: 总是擦破皮 | 来源:发表于2016-05-13 15:43 被阅读0次

    之前项目里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
        }
    
    }
    

    相关文章

      网友评论

          本文标题:带删除按钮的自定义EditText

          本文链接:https://www.haomeiwen.com/subject/tsqmrttx.html