天天看點

關于EditText的一點深入的了解

最近在開發android下的記事本程式時,頻繁的使用EditText控件,折騰來折騰去,算是對其的了解更深入了一些。特将這些收獲記錄如下:

一、幾個屬性的介紹

android:gravity= "top"     

這個屬性為top可以将光标置于左上角(當EditText設為全屏時)

android:background= "@null"    

這個屬性為null可以将輸入的框線去掉

android:textCursorDrawable= "@drawable/ic_launcher"

這個屬性可以設定光标為drawable樣式(可以為一張圖檔)

android:editable= "false"

這個屬性為false,則EditText不可編輯。 注意是僅僅不能進行輸入,但是EditText的滾動什麼的還是可以響應的。

android:enabled="false"

這個屬性為false,則EditText也是不可編輯。 注意不僅不可編輯,連滾動什麼的都不可以響應,是以可以說是直接讓EditText不可用。

android:cursorVisible="false“

這個屬性為false,則EditText的光标不可見。

android:focusableInTouchMode= "false"

這個屬性為false,則EditText不響應觸摸模式的焦點,或者說觸摸事件不可用。

===========================================================================================

二、監聽EditText的輸入

可以使用TextWatcher來監聽EditText的輸入。使用方法如下:

Et.addTextChangedListener(new TextWatcher() {
   //S:變化後的所有字元;start:字元起始的位置;before: 變化之前的總位元組數;count:變化後的位元組數
  public void onTextChanged(CharSequence s, int start, int before, int count) {
  }
 //s:變化前的所有字元; start:字元開始的位置; count:變化前的總位元組數;after:變化後的位元組數
  public void beforeTextChanged(CharSequence s, int start, int count,
      int after) {
  }
//s:變化後的所有字元
  public void afterTextChanged(Editable s) {
  }
  });

           

是以如果有需要,或者對EditText做一些個性化的設定,即可以使用addTextChangedListener來為EditText添加監聽器!

=========================================================================================

三、制作隻讀的EditText控件

首先說明一下需求: 該EditText隻會禁止輸入,但是可以檢視,滾動和觸摸什麼的都會響應,也就是說僅僅是禁止輸入而已! 不妨稱之為隻讀模式。

怎麼制作出一個這樣子的EditText呢?網上有很多辦法,我幾乎都一一試過,但是所使用的方法都無法達到滿意。比如:

(1)如果通過設定android:editable屬性來使EditText不可輸入。這個雖然能完美的達到要求。 但是,當EditText又需要恢複可輸入狀态時,沒有相應的動态代碼來恢複!

(2)如果使用 android:enabled屬性,則會使EditText整個不可用,也就是說不僅不可輸入,連滾動什麼的都不用了。

最後,理了理思路,終于解決了這個問題。達到我的預期: 即EditText隻讀模式達到了,在恢複其可編輯狀态時也能很容易的恢複。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

我的做法如下:

制作出一個隻讀模式的EditText

其實很簡單進行下面兩步設定即可:
(1)隻讀模式,當然不需要顯示光标了。在xml中設定如下即可:
 android:cursorVisible="false“
(2)隻讀模式當然不需要彈出輸入法了,輸入法不彈出,當然就不能編輯了。為了點到EditText不讓彈出輸入法,我們隻需讓其對觸摸事件不響應即可:
 android:focusableInTouchMode="false"

經過上面兩步簡單的設定,就可以讓EditText為隻讀模式了。


然後恢複EditText為可編輯:

根據上面的設定,是以想要将EditText恢複為可編輯狀态,隻需要下面兩行代碼即可:
editText.setFocusableInTouchMode(true);

editText.setCursorVisible(true);
 
           

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

另外需要說明的是,也可以利用下面的方法動态的設定EditText的可輸入與不可輸入狀态。

動态設定EditText不可輸入任何字元

//設定EditText不可輸入。但保留滑動,可點選等屬性。隻是不可輸入而已
et.setFilters(new InputFilter[] { new InputFilter() {
  @Override
  public CharSequence filter(CharSequence source, int start,
      int end, Spanned dest, int dstart, int dend) {
    return source.length() < 1 ? dest.subSequence(dstart, dend) : "";
  }
  } });

           

這樣,利用上面的代碼,即使你利用輸入鍵盤輸入,也無法輸入到EditText中。對應的,相應的恢複輸入可采用下面的代碼:

//設定輸入法可以輸入(或者叫恢複輸入)
et.setFilters(new InputFilter[] { new InputFilter() {
    public CharSequence filter(CharSequence source, int start,
      int end, Spanned dest, int dstart, int dend) {
  // TODO Auto-generated method stub
  return null;
    }
    } });
      

=================================================================================

四、不自動彈出輸入法的鍵盤

當你的布局中含有一個EditText中的時候,你會發現隻要你進入這個活動的界面,輸入法鍵盤就會自動彈出來。在你不打算首先給EditText做輸入的時候,

這個自動彈出的輸入法則是非常惹人讨厭的!是以可以利用下面的兩種辦法來禁止因為有了EditText而自動彈出輸入法:

(1)方法一
  經過測驗,如果EditText和TextView在一起的話,那麼輸入法就不會自動彈出。這是由于TextView本身的特性導緻的。順便說一句,EditText本身就是繼承自TextView的。
  是以,你可以放一個TextView到你的布局中,來防止自動彈出輸入法。
(2)方法二
  還可以利用代碼動态設定不彈出輸入法。隻需要在合适的地方,寫下下面的代碼即可。下面的代碼就是讓EditText預設不顯示軟鍵盤,隻有當被點選的時候才會顯示出軟鍵盤
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE |
           WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
      

=========================================================================================

五、設定EditText顯示為密碼格式

有兩種方式,即在xnl中和利用代碼動态設定。如下:

(1)方式一
android:inputType="textPassword"
(2)方式二
edit.setTransformationMethod(PasswordTransformationMethod.getInstance());      

inputType即為輸入字元的類型。在這裡網上有個很好的總結,如下:

1 android:inputType參數類型說明
 2 android:inputType="none"--輸入普通字元
 3 android:inputType="text"--輸入普通字元
 4 android:inputType="textCapCharacters"--輸入普通字元
 5 android:inputType="textCapWords"--單詞首字母大小
 6 android:inputType="textCapSentences"--僅第一個字母大小
 7 android:inputType="textAutoCorrect"--前兩個自動完成
 8 android:inputType="textAutoComplete"--前兩個自動完成
 9 android:inputType="textMultiLine"--多行輸入
10 android:inputType="textImeMultiLine"--輸入法多行(不一定支援)
11 android:inputType="textNoSuggestions"--不提示
12 android:inputType="textUri"--URI格式
13 android:inputType="textEmailAddress"--電子郵件位址格式
14 android:inputType="textEmailSubject"--郵件主題格式
15 android:inputType="textShortMessage"--短消息格式
16 android:inputType="textLongMessage"--長消息格式
17 android:inputType="textPersonName"--人名格式
18 android:inputType="textPostalAddress"--郵政格式
19 android:inputType="textPassword"--密碼格式
20 android:inputType="textVisiblePassword"--密碼可見格式
21 android:inputType="textWebEditText"--作為網頁表單的文本格式
22 android:inputType="textFilter"--文本篩選格式
23 android:inputType="textPhonetic"--拼音輸入格式
24 android:inputType="number"--數字格式
25 android:inputType="numberSigned"--有符号數字格式
26 android:inputType="numberDecimal"--可以帶小數點的浮點格式
27 android:inputType="phone"--撥号鍵盤
28 android:inputType="datetime"
29 android:inputType="date"--日期鍵盤
30 android:inputType="time"--時間鍵盤
           

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

在這裡再插一句吧。 說一下EditText或者TextView中的setInputType和setTransformationmethod方法。

(1)setinputType可以設定EditText(TextView也可以)的輸入方式。比如Contact、Email、Date、Time、Short Message、Normal Text、Password 等。

還可以指定各種更正選項,如 單詞首字母大寫、句子首字母大寫、自動更正等。下面的代碼是一個使用範例:

int inputType = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT
                      | InputType.TYPE_TEXT_FLAG_MULTI_LINE | InputType.TYPE_TEXT_FLAG_AUTO_CORRECT
                      | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE;
      EditText.setInputType(inputType);      

(2) setTransformationMethod則可以支援将輸入的字元轉換,包括清除換行符、轉換為掩碼。使用方法:

textView.setTransformationMethod(PasswordTransformationMethod.getInstance());      

綜合來說,如果需要實作自己的轉換,可以通過實作 TransformationMethod 接口來達到你的目的(比如讓輸入的所有字元都變成 a,或者輸入 a 顯示 z,輸入 z 顯示 a 等)。

=========================================================================================