天天看點

【Android源碼解析】 自定義可清除的輸入框

版權聲明:本文為部落客原創文章,轉載請标明出處。 https://blog.csdn.net/lyhhj/article/details/47417337

今天給大家分享一下這個關于Edittext,之前用到過要求能一鍵清除的輸入框,想了一下思路,可以在輸入框的旁邊放一個小的清除圖檔,然後給Edittext和清除的小圖檔放到布局中,給布局來一個背景圖檔,看起來也比較美觀的,然後根據edittext.getText().length來設定小圖檔是否可見,覺得也還行。但是随着自己見得多了就發現這樣雖然也能實作,真的很水,是以就想着自定義一個能清除的Edittext。

下面說一下自己的思路:

1.首先自定義元件繼承edittext

2.重寫構造方法,初始化一個清楚按鈕的小圖示,并設定它的位置

3.監聽edittext的焦點改變,根據焦點變化顯示隐藏小圖示

4.重寫一個小圖示的按鈕點選事件

貼上部分代碼:

/**
     * 這裡我們不能設定edittext的點選事件,是以我們可以這樣做一下:
     * 當我們按下的位置 是在(輸入框的寬度-圖示的寬度-圖示距離右側的寬度)和(輸入框的寬度-圖示到右側的寬度)之間
     * 也就是說我們按下的位置處于圖示的附近,設定輸入框
     * by Hankkin  at:2015年8月11日 16:45:42
     * @param event
     * @return
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (getCompoundDrawables()[2]!=null){
            if (event.getAction() == MotionEvent.ACTION_UP){
                boolean touchable = event.getX()>(getWidth()-getPaddingRight()-deleteDraw.getIntrinsicWidth())&&
                        (event.getX() < ((getWidth() - getPaddingRight())));
                if (touchable){
                    setText("");
                }

            }
        }
        return super.onTouchEvent(event);
    }           
/**
     * 設定清除圖檔是否可見
     * by Hankkin at:2015年8月11日 16:17:24
     * @param isVisible
     */
    private void setDeleteVisible(boolean isVisible){
        Drawable drawable = isVisible?deleteDraw:null;
        setCompoundDrawables(getCompoundDrawables()[0],getCompoundDrawables()[1],drawable,getCompoundDrawables()[3]);
    }

    /**
     * 根據edittext的焦點變化改變圖檔的顯示與否,輸入框裡的字元串長度如果大于0,顯示,否則隐藏
     * by Hankkin at:2015年8月11日 16:32:47
     * @param v
     * @param hasFocus
     */
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus){
            setDeleteVisible(getText().length()>0);
        }else {
            setDeleteVisible(false);
        }
    }           

然後在我們xml直接引用這個控件就ok了

github位址:

https://github.com/Hankkin/ClearEditTextDemo.git

源碼位址:

http://download.csdn.net/detail/lyhhj/8991711

繼續閱讀