自定義EditText控制DrawableRight的顯示或隱藏

目的:
有時(shí)候在做搜索功能時(shí)掸鹅,如果EditText有內(nèi)容,則在右側(cè)顯示一個(gè)刪除圖標(biāo)拦赠,點(diǎn)擊刪除圖標(biāo)刪除內(nèi)容巍沙;

當(dāng)EditText內(nèi)容為空時(shí),則隱藏刪除圖標(biāo)荷鼠。
效果圖:


edittext.gif

p.s. 這是我正在做的一個(gè)畢業(yè)設(shè)計(jì)句携,Android + JavaWeb。前端app允乐,后臺(tái)都會(huì)有矮嫉。我每天會(huì)往Github上提交代碼,這個(gè)上面會(huì)有完整的項(xiàng)目牍疏。歡迎star蠢笋,fork。GitHub:https://github.com/uweii/SHShop

/*
* 自定義EditText鳞陨,有文字時(shí)昨寞,右邊顯示刪除按鈕
* 沒有文字時(shí),隱藏刪除按鈕
* */
public class ClearTextEditText extends AppCompatEditText implements View.OnFocusChangeListener, TextWatcher {
  private Drawable mClearDrawable;
  private boolean hasFocus; //控件是否有焦點(diǎn)
  public ClearTextEditText(Context context) {
      super(context);
      init(context, null);
  }

  public ClearTextEditText(Context context, AttributeSet attrs) {
      super(context, attrs);
      init(context, attrs);
  }

  public ClearTextEditText(Context context, AttributeSet attrs, int defStyleAttr) {
      super(context, attrs, defStyleAttr);
      init(context, attrs);
  }
  private void init(Context context, AttributeSet attr){
      mClearDrawable = getCompoundDrawables()[2];
      if(mClearDrawable == null){
          mClearDrawable = getResources().getDrawable(R.drawable.del_icon);
      }
      //drawable.setBounds :設(shè)置Drawable的邊界,必須要有
      mClearDrawable.setBounds(0,0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight());
      setOnFocusChangeListener(this);
      addTextChangedListener(this);
  }

  @Override
  public void onFocusChange(View view, boolean b) {
      this.hasFocus = b;
      LogUtil.d("hasFocus: " + b);
      if (hasFocus){
          //焦點(diǎn)存在援岩,而且有輸入值歼狼,顯示右側(cè)刪除圖標(biāo)
          setDrawableRightVisible(getText().length() > 0);
      }else {
          //沒有焦點(diǎn),隱藏刪除圖標(biāo)
          setDrawableRightVisible(false);
          clearFocus();
      }
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
      if(event.getAction() == MotionEvent.ACTION_UP){
          if(getCompoundDrawables()[2] != null){
              //根據(jù)觸摸的位置判斷是否點(diǎn)擊 右側(cè)圖標(biāo)
              boolean isTouchRight = (event.getX() > (getWidth() - getTotalPaddingRight())) &&
                      (event.getX() < (getWidth() - getPaddingRight()));
              //LogUtil.d("isTouchRight: " + isTouchRight);
              if(isTouchRight){
                  setText("");
              }
          }
      }
      return super.onTouchEvent(event);
  }

  private void setDrawableRightVisible(boolean visible){
      Drawable drawableRight = visible ? mClearDrawable : null;
      //getCompoundDrawables()可以獲得一個(gè){DrawableLeft, DrawableTop, DrawableRiht, DrawableBottom}的數(shù)組享怀。
      //getCompoundDrawables()[2]表示獲取EditText的DrawableRight
      setCompoundDrawables(getCompoundDrawables()[0],getCompoundDrawables()[1], drawableRight, getCompoundDrawables()[3]);
  }

  @Override
  public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
      if(mOnTextChangedListener != null){
          mOnTextChangedListener.beforeTextChanged(charSequence, i, i1, i2);
      }
  }

  @Override
  public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
      if(hasFocus){
          setDrawableRightVisible(charSequence.length() > 0);
      }
      if(mOnTextChangedListener != null){
          mOnTextChangedListener.onTextChanged(charSequence, i, i1, i2);
      }
  }

  @Override
  public void afterTextChanged(Editable editable) {
      if(mOnTextChangedListener != null){
          mOnTextChangedListener.afterTextChanged(editable);
      }
  }
  //文本改變接口監(jiān)聽
  public interface OnTextChangedListener{
      void beforeTextChanged(CharSequence s, int start, int count, int after);

      void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter);

      void afterTextChanged(Editable s);
  }
  private OnTextChangedListener mOnTextChangedListener;
  public void setOnTextChangedListener(OnTextChangedListener onTextChangedListener){
      this.mOnTextChangedListener = onTextChangedListener;
  }

}

現(xiàn)在我們就使用這個(gè)自定義控件:

 <com.up.uwei.shshop.view.ClearTextEditText
                android:id="@+id/et_search"
                android:layout_width="0dp"
                android:layout_height="40dp"
                android:layout_gravity="center_vertical"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="5dp"
                android:layout_weight="5"
                android:background="@drawable/bg_input"
                android:drawableLeft="@drawable/ic_search"
                android:gravity="center_vertical"
                android:hint="輸入搜索"
                android:textColor="@color/search_hint"
                android:textSize="15sp" />

就可以咯羽峰、

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凹蜈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忍啸,老刑警劉巖仰坦,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異计雌,居然都是意外死亡悄晃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門凿滤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妈橄,“玉大人,你說我怎么就攤上這事翁脆【祢荆” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵反番,是天一觀的道長(zhǎng)沙热。 經(jīng)常有香客問我,道長(zhǎng)罢缸,這世上最難降的妖魔是什么篙贸? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮枫疆,結(jié)果婚禮上爵川,老公的妹妹穿的比我還像新娘。我一直安慰自己息楔,他們只是感情好寝贡,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著值依,像睡著了一般兔甘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鳞滨,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天洞焙,我揣著相機(jī)與錄音,去河邊找鬼。 笑死澡匪,一個(gè)胖子當(dāng)著我的面吹牛熔任,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播唁情,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼疑苔,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了甸鸟?” 一聲冷哼從身側(cè)響起惦费,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抢韭,沒想到半個(gè)月后薪贫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刻恭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年瞧省,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鳍贾。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鞍匾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出骑科,到底是詐尸還是另有隱情橡淑,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布咆爽,位于F島的核電站梳码,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏伍掀。R本人自食惡果不足惜掰茶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜜笤。 院中可真熱鬧濒蒋,春花似錦、人聲如沸把兔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽县好。三九已至围橡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缕贡,已是汗流浹背翁授。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工拣播, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人收擦。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓贮配,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親塞赂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泪勒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361