欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android UI設(shè)計(jì)系列之自定義EditText實(shí)現(xiàn)帶清除功能的輸入框(3)

 更新時(shí)間:2021年03月15日 08:16:37   作者:llew2011  
這篇文章主要介紹了Android UI設(shè)計(jì)系列之自定義EditText實(shí)現(xiàn)帶清除功能的輸入框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

最近公司的產(chǎn)品在陸續(xù)做升級,上級領(lǐng)導(dǎo)給的任務(wù)是優(yōu)化代碼結(jié)構(gòu)以及項(xiàng)目架構(gòu),力爭把項(xiàng)目寫的精巧簡練,于是我們滿工程找冗余...

我們都知道每一個(gè)項(xiàng)目基本上都是有登陸頁的,在登陸頁中肯定是少不了輸入框了,當(dāng)我們在輸入框中輸入數(shù)據(jù)后如果輸入的內(nèi)容不正確或者是錯(cuò)誤的或者是想重新輸入,如果嗯鍵盤上的刪除鍵就得一個(gè)一個(gè)的去刪除,這時(shí)候我們或許就想要是能有一個(gè)標(biāo)記當(dāng)點(diǎn)擊了這個(gè)標(biāo)記能把我們剛剛輸入的內(nèi)容清空就好了。這樣可以極大的提升用戶體驗(yàn),就拿QQ的登陸來說吧,效果如下:

當(dāng)點(diǎn)擊密碼框右側(cè)的小×圖標(biāo)時(shí)輸入的內(nèi)容就都清空了,真的很方便,我之前在項(xiàng)目中也自定義過這種效果的輸入框并且在項(xiàng)目中一直使用它,在此期間并沒有發(fā)現(xiàn)什么Bug,之前的自定義結(jié)構(gòu)如下:

實(shí)現(xiàn)方式是使用一個(gè)RelativeLayout,它包含了三個(gè)控件,兩邊是ImageView控件,中間是EditText控件,當(dāng)點(diǎn)擊右側(cè)清除按鈕后就可以清除輸入框的內(nèi)容了,但是最近在做產(chǎn)品優(yōu)化的時(shí)候感覺之前寫的這個(gè)自定義控件在代碼量上來說有點(diǎn)浪費(fèi),明明Android的EditText有drawableLeft和drawableRight屬性,為什么不去直接使用呢?于是用筆在草稿紙上畫了畫,花點(diǎn)時(shí)間又重新寫了一個(gè)具有同樣效果的輸入框,并且在代碼量上來說簡化了不少。

好了,還是老規(guī)矩,先來看看項(xiàng)目結(jié)構(gòu)吧:

工程中ClearEditText就是我又從新定義的帶清除功能的輸入框,主要是繼承了EditText為了利用它的drawableLeft和drawableRight屬性,那么趕緊看看它的實(shí)現(xiàn)吧

public class ClearEditText extends EditText implements TextWatcher, 
 OnFocusChangeListener { 
 
 /** 
 * 左右兩側(cè)圖片資源 
 */ 
 private Drawable left, right; 
 /** 
 * 是否獲取焦點(diǎn),默認(rèn)沒有焦點(diǎn) 
 */ 
 private boolean hasFocus = false; 
 /** 
 * 手指抬起時(shí)的X坐標(biāo) 
 */ 
 private int xUp = 0; 
 
 public ClearEditText(Context context) { 
 this(context, null); 
 } 
 
 public ClearEditText(Context context, AttributeSet attrs) { 
 this(context, attrs, android.R.attr.editTextStyle); 
 } 
 
 public ClearEditText(Context context, AttributeSet attrs, int defStyle) { 
 super(context, attrs, defStyle); 
 initWedgits(); 
 } 
 
 /** 
 * 初始化各組件 
 * @param attrs 
 *  屬性集 
 */ 
 private void initWedgits() { 
 try { 
  // 獲取drawableLeft圖片,如果在布局文件中沒有定義drawableLeft屬性,則此值為空 
  left = getCompoundDrawables()[0]; 
  // 獲取drawableRight圖片,如果在布局文件中沒有定義drawableRight屬性,則此值為空 
  right = getCompoundDrawables()[2]; 
  initDatas(); 
 } catch (Exception e) { 
  e.printStackTrace(); 
 } 
 } 
 
 /** 
 * 初始化數(shù)據(jù) 
 */ 
 private void initDatas() { 
 try { 
  // 第一次顯示,隱藏刪除圖標(biāo) 
  setCompoundDrawablesWithIntrinsicBounds(left, null, null, null); 
  addListeners(); 
 } catch (Exception e) { 
  e.printStackTrace(); 
 } 
 } 
 
 /** 
 * 添加事件監(jiān)聽 
 */ 
 private void addListeners() { 
 try { 
  setOnFocusChangeListener(this); 
  addTextChangedListener(this); 
 } catch (Exception e) { 
  e.printStackTrace(); 
 } 
 } 
 
 @Override 
 public void beforeTextChanged(CharSequence s, int start, int count, 
  int after) { 
 } 
 
 @Override 
 public void onTextChanged(CharSequence s, int start, int before, int after) { 
 if (hasFocus) { 
  if (TextUtils.isEmpty(s)) { 
  // 如果為空,則不顯示刪除圖標(biāo) 
  setCompoundDrawablesWithIntrinsicBounds(left, null, null, null); 
  } else { 
  // 如果非空,則要顯示刪除圖標(biāo) 
  if (null == right) { 
   right = getCompoundDrawables()[2]; 
  } 
  setCompoundDrawablesWithIntrinsicBounds(left, null, right, null); 
  } 
 } 
 } 
 
 @Override 
 public boolean onTouchEvent(MotionEvent event) { 
 try { 
  switch (event.getAction()) { 
  case MotionEvent.ACTION_UP: 
  // 獲取點(diǎn)擊時(shí)手指抬起的X坐標(biāo) 
  xUp = (int) event.getX(); 
  // 當(dāng)點(diǎn)擊的坐標(biāo)到當(dāng)前輸入框右側(cè)的距離小于等于getCompoundPaddingRight()的距離時(shí),則認(rèn)為是點(diǎn)擊了刪除圖標(biāo) 
  // getCompoundPaddingRight()的說明:Returns the right padding of the view, plus space for the right Drawable if any. 
  if ((getWidth() - xUp) <= getCompoundPaddingRight()) { 
   if (!TextUtils.isEmpty(getText().toString())) { 
   setText(""); 
   } 
  } 
  break; 
  default: 
  break; 
  } 
 } catch (Exception e) { 
  e.printStackTrace(); 
 } 
 return super.onTouchEvent(event); 
 } 
 
 @Override 
 public void afterTextChanged(Editable s) { 
 } 
 
 @Override 
 public void onFocusChange(View v, boolean hasFocus) { 
 try { 
  this.hasFocus = hasFocus; 
 } catch (Exception e) { 
  e.printStackTrace(); 
 } 
 } 
} 

解釋一下ClearEditText的執(zhí)行順序,它首先繼承了EditText也就是說具有了EditText的所有功能,然后又實(shí)現(xiàn)了TextWatcher和OnFocusChangeListener接口,其中接口OnFocusChangeListener是用來監(jiān)聽當(dāng)前輸入框是否獲取到焦點(diǎn)的,我們把當(dāng)前輸入框獲取到的焦點(diǎn)的狀態(tài)值賦給hasFocus成員變量,如果獲取到了焦點(diǎn)則hasFocus的值為true,當(dāng)在輸入框中輸入內(nèi)容的時(shí)候會(huì)觸發(fā)TextWatcher監(jiān)聽器,就會(huì)順序執(zhí)行beforeTextChanged,onTextChanged和afterTextChanged方法,而我們僅僅需要在onTextChanged方法中對輸入框的值進(jìn)行判斷就行了,如果輸入框框的值非空就顯示清空按鈕小圖標(biāo)否則不顯示,設(shè)置圖標(biāo)隱藏和顯示的方法就是直接調(diào)用setCompoundDrawablesWithIntrinsicBounds方法就行了,這個(gè)方法的具體使用就不詳解了,大體就是說按照我們給定的圖片尺寸把圖片畫到輸入框的四個(gè)方向上,如果傳入值為null就表示不繪制。

接下來就是對清空小圖標(biāo)進(jìn)行監(jiān)聽了,我首先想到的是如果清空小圖標(biāo)是顯示的,就給他設(shè)置事件監(jiān)聽比如onClickListener或者是onTouchListener,但是遺憾的是找了API并沒有發(fā)現(xiàn)EditText提供對drawLeft或者是drawRight的事件監(jiān)聽,又來又打算自定義一個(gè)監(jiān)聽器但仔細(xì)想想又把代碼復(fù)雜化了,其實(shí)EditText是間接繼承View的而View中有個(gè)onTouchEvent方法,我們可以重寫onTouchEvent方法并在它里邊根據(jù)我們手指摁下或者是抬起的坐標(biāo)進(jìn)行判斷,如果點(diǎn)擊的位置到當(dāng)前控件右側(cè)的距離小于等于當(dāng)前控件右側(cè)小圖標(biāo)的寬度加上paddingRight的值,則我們可以直接認(rèn)為是點(diǎn)擊了清除小圖標(biāo),就可以對當(dāng)前控件進(jìn)行清空操作了,幸好EditText給我們提供了一個(gè)我現(xiàn)在認(rèn)為是非常實(shí)在的方法:getCompoundPaddingRight(),文檔的解釋就是:Returns the right padding of the view, plus space for the right Drawable if any.它的值就是清空小圖標(biāo)的寬度加上paddingRight的值,呵呵,有了它就好辦多了,(*^__^*) 嘻嘻……

好了,接下來我們來看看在布局文件中怎么使用它吧(其實(shí)很簡單,就是和EditText的使用方法一樣的,(*^__^*) 嘻嘻……)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
 xmlns:android="http://schemas.android.com/apk/res/android" 
 android:orientation="vertical" 
 android:layout_width="fill_parent" 
 android:layout_height="fill_parent" 
 android:background="#ffffff"> 
 <TextView 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:layout_margin="10dip" 
 android:text="@string/hello" 
 android:gravity="center" 
 android:textSize="20sp" 
 android:textColor="#000000" /> 
 
 <com.llew.e.clear.view.wedgit.ClearEditText 
 android:id="@+id/clearEditText" 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 android:layout_margin="10dip" 
 android:paddingRight="8dip" 
 android:paddingTop="5dip" 
 android:paddingBottom="5dip" 
 android:hint="請輸入QQ號碼" 
 android:background="@drawable/pay_widget_input" 
 android:drawableLeft="@drawable/super_qq" 
 android:drawableRight="@drawable/clear_normal_list" /> 
 
</LinearLayout> 

就是寫完整我們自定義的包名就行了,屬性用的全是父類中的,再次感謝Java給我們提供的繼承特性,呵呵,
在運(yùn)行之前還是貼出來MainActivity代碼吧,其實(shí)真的很簡單:

public class MainActivity extends Activity { 
 /** Called when the activity is first created. */ 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.main); 
 } 
} 

簡單吧?創(chuàng)建工程的時(shí)候自動(dòng)生成的,壓根不用進(jìn)行任何操作,呵呵
好了,我們運(yùn)行一下,看看效果圖吧O(∩_∩)O~

輸入前:

輸入后:

點(diǎn)擊清除圖標(biāo)后:

呵呵,這種效果和之前自定義的一樣,并且在代碼量上來說卻是比之前的減少了不少,高興一下

好了,今天的自定義ClearEditText就講到這里,感謝收看。

源碼下載:Android UI實(shí)現(xiàn)帶清除功能的輸入框

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android 短信驗(yàn)證碼自動(dòng)填寫

    Android 短信驗(yàn)證碼自動(dòng)填寫

    這篇文章主要介紹了Android 短信驗(yàn)證碼自動(dòng)填寫的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Android中如何加載數(shù)據(jù)緩存

    Android中如何加載數(shù)據(jù)緩存

    這篇文章主要介紹了Android中如何加載數(shù)據(jù)緩存的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • Android使用AsyncTask加載圖片的操作流程

    Android使用AsyncTask加載圖片的操作流程

    今天小編就為大家分享一篇關(guān)于Android使用AsyncTask加載圖片的操作流程,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Android仿QQ復(fù)制昵稱效果的實(shí)現(xiàn)方法

    Android仿QQ復(fù)制昵稱效果的實(shí)現(xiàn)方法

    這篇文章主要介紹了Android仿QQ復(fù)制昵稱效果的實(shí)現(xiàn)方法,主要依賴的是一個(gè)開源項(xiàng)目,需要的朋友可以參考下
    2019-05-05
  • Android​短信驗(yàn)證碼倒計(jì)時(shí)驗(yàn)證的2種常用方式

    Android​短信驗(yàn)證碼倒計(jì)時(shí)驗(yàn)證的2種常用方式

    各位開發(fā)者們在開發(fā)中經(jīng)常會(huì)遇到獲取短信驗(yàn)證碼,獲取驗(yàn)證碼后需要等待1分鐘倒計(jì)時(shí),這段時(shí)間是不能再次發(fā)送短信請求的。這篇文章總結(jié)了兩種常用的Android&#8203;短信驗(yàn)證碼倒計(jì)時(shí)驗(yàn)證方式,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • Activity生命周期實(shí)例講解

    Activity生命周期實(shí)例講解

    這篇文章介紹了Activity中7個(gè)與生命周期有關(guān)的函數(shù),使用實(shí)例代碼說明他們的使用方法
    2013-11-11
  • Android?Framework層獲取及處理按鍵事件流程

    Android?Framework層獲取及處理按鍵事件流程

    本文主要介紹了Android?Framework層獲取及處理按鍵事件流程,Android系統(tǒng)的輸入事件是InputManagerService服務(wù)來監(jiān)控的,該系統(tǒng)服務(wù)在SystemServer的startOtherServices()中初始化,更多介紹需要的小伙伴可以參考一下
    2022-08-08
  • Android 啟動(dòng)模式詳細(xì)介紹

    Android 啟動(dòng)模式詳細(xì)介紹

    這篇文章主要介紹了Android 啟動(dòng)模式詳細(xì)介紹的相關(guān)資料,Activity一共有以下四種launchMode啟動(dòng)模式,這里一一做詳解,需要的朋友可以參考下
    2016-12-12
  • Android開發(fā)之超強(qiáng)圖片工具類BitmapUtil完整實(shí)例

    Android開發(fā)之超強(qiáng)圖片工具類BitmapUtil完整實(shí)例

    這篇文章主要介紹了Android開發(fā)之超強(qiáng)圖片工具類BitmapUtil,結(jié)合完整實(shí)例形式分析了Android圖片的常用操作技巧,包括圖片的加載、轉(zhuǎn)換、縮放、計(jì)算等相關(guān)操作技巧,需要的朋友可以參考下
    2017-11-11
  • Android自定義View實(shí)現(xiàn)炫酷進(jìn)度條

    Android自定義View實(shí)現(xiàn)炫酷進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)炫酷進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11

最新評論