歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 關於EditText的一點深入的了解

關於EditText的一點深入的了解

日期:2017/3/1 9:20:37   编辑:Linux編程

最近在開發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 等)。

Copyright © Linux教程網 All Rights Reserved