最近在開發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) { }因此如果有需要,或者對EditText做一些個性化的設置,即可以使用addTextChangedListener來為EditText添加監聽器!
//s:變化前的所有字符; start:字符開始的位置; count:變化前的總字節數;after:變化後的字節數 public void beforeTextChanged(CharSequence s, int start, int count, int after) { } //s:變化後的所有字符 public void afterTextChanged(Editable s) { } });
三、制作只讀的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 等)。