1. 程式人生 > >Android EditText的屬性和方法介紹使用及值得注意的點

Android EditText的屬性和方法介紹使用及值得注意的點

一、EditView屬性詳細介紹:

屬性名稱

描述

android:utoLink

設定是否當文字為URL連結/email/電話號碼/map時,文字顯示為可點選的連結。

可選值(none/web/email/phone/map/all)

這裡只有在同時設定text時才自動識別連結,後來輸入的無法自動識別。

android:autoText

自動拼寫幫助。這裡單獨設定是沒有效果的,可能需要其他輸入法輔助才行,

效果參見視訊 。

android:bufferType

指定getText()方式取得的文字類別。選項editable 類似於StringBuilder可追加字元,

也就是說getText

後可呼叫append方法設定文字內容。

spannable 則可在給定的字元區域使用樣式,參見這裡、這裡

android:capitalize

設定英文字母大寫型別。設定如下值:sentences僅第一個字母大寫;

words每一個單詞首字母大小,用空格區分單詞

characters每一個英文字母都大寫。

在模擬器上用PC鍵盤直接輸入可以出效果,但是用軟鍵盤無效果。

android:cursorVisible

設定游標為顯示/隱藏,預設顯示。

如果設定false,即使選中了也不顯示游標欄。

android:digits

設定允許輸入哪些字元。如“1234567890.+-*/%\n()”

android:drawableTop

text的正上方輸出一個drawable

EditView中的效果比較搞笑:居然在文字框裡,而且刪不了。

android:drawableBottom

text的下方輸出一個drawable,如圖片。

如果指定一個顏色的話會把text的背景設為該顏色,

並且同時和background使用時覆蓋後者。

android:drawableLeft

text的左邊輸出一個drawable(如圖片)。

android:drawablePadding

設定textdrawable(圖片)的間隔,與drawableLeft

drawableRight

drawableTopdrawableBottom一起使用,可設定為負數,

單獨使用沒有效果。

android:drawableRight

text的右邊輸出一個drawable,如圖片。

android:editable

設定是否可編輯。仍然可以獲取游標,但是無法輸入。

android:editorExtras

指定特定輸入法的擴充套件,如“com.mydomain.im.SOME_FIELD”

原始碼跟蹤至EditorInfo.extras,暫無相關實現程式碼。

android:ellipsize

設定當文字過長時,該控制元件 該如何顯示。

有如下值設定:”start”—–省略號顯示在開頭;

”end”——省略號顯示在結尾;”middle”—-省略號顯示在中間;

”marquee” ——以跑馬燈 的方式顯示(動畫 橫向移動)

android:freezesText

設定儲存文字的內容以及游標的位置。

android:gravity

設定文字位置,如設定成“center”,文字將居中顯示。

android:hint

Text為空時顯示的文字提示資訊,

可通過textColorHint設定提示資訊的顏色。

android:imeOptions

設定軟鍵盤的Enter鍵。

有如下值可設定:normalactionUnspecifiedactionNoneactionGo

actionSearchactionSendactionNextactionDone
flagNoExtractUiflagNoAccessoryActionflagNoEnterAction

可用’|’設定多個。

<EditText android:id="@+id/txtTest" android:imeOptions="actionGo"

    android:layout_width="100dp" android:layout_height="wrap_content">

</EditText>

((EditText)findViewById(R.id.txtTest)).setOnEditorActionListener(

new TextView.OnEditorActionListener() {

            @Override

            public boolean onEditorAction(TextView v,

 int actionId, KeyEvent event) {

                if (actionId == EditorInfo.IME_ACTION_GO) {

                    Toast.makeText(TestActivity.this, "你點了Go!", 

Toast.LENGTH_SHORT).show();

                }

                return false;

            }

        }); 

android:imeActionId

設定IME動作ID,在onEditorAction中捕獲判斷進行邏輯操作。

android:imeActionLabel

設定IME動作標籤。但是不能保證一定會使用,

猜想在輸入法擴充套件的時候應該有用。

android:includeFontPadding

設定文字是否包含頂部和底部額外空白,預設為true

android:inputMethod

為文字指定輸入法,需要完全限定名(完整的包名)。

例如:com.google.android.inputmethod.pinyin,但是這裡報錯找不到。

android:inputType

設定文字的型別,用於幫助輸入法顯示合適的鍵盤型別。

有如下值設定:nonetext、 textCapCharacters字母大小、

textCapWords單詞首字母大小、textCapSentences僅第一個字母大小、

textAutoCorrecttextAutoComplete自動完成、textMultiLine多行輸入、

textImeMultiLine輸 入法多行(如果支援)、textNoSuggestions不提示、

textEmailAddress電子郵件地址、textEmailSubject郵 件主題、

textShortMessage簡訊息(會多一個表情按鈕出來,點開如下圖:

)、textLongMessage長訊息?、textPersonName人名、 

textPostalAddress地址、textPassword密碼、textVisiblePassword可見密碼、

textWebEditText作為網頁表單的文字、textFilte文字篩選過濾、

textPhonetic拼音輸入、numberSigned有符 號數字格式、

numberDecimal可帶小數點的浮點格式、phone電話號碼、

datetime時間日期、date日期、time時間。部分參考這裡 。

android:marqueeRepeatLimit

ellipsize指定marquee的情況下,設定重複滾動的次數,

當設定為marquee_forever時表示無限次。

android:ems

設定TextView的寬度為N個字元的寬度。

參見TextView中此屬性的截圖。

android:maxEms

設定TextView的寬度為最長為N個字元的寬度。

ems同時使用時覆蓋ems選項。

android:minEms

設定TextView的寬度為最短為N個字元的寬度。

ems同時使用時覆蓋ems選項。

android:maxLength

限制輸入字元數。

如設定為5,那麼僅可以輸入5個漢字/數字/英文字母。

android:lines

設定文字的行數,設定兩行就顯示兩行,即使第二行沒有資料。

android:maxLines

設定文字的最大顯示行數,與width或者layout_width結合使用,

超出部分自動換行,超出行數將不顯示。

android:minLines

設定文字的最小行數,與lines類似。

android:linksClickable

設定連結是否點選連線,即使設定了autoLink

android:lineSpacingExtra

設定行間距。

android:lineSpacingMultiplier

設定行間距的倍數。如”1.2”

android:numeric

如果被設定,該TextView有一個數字輸入法。

有如下值設定:integer正整數、signed帶符號整數、

decimal帶小數點浮點數。

android:password

以小點”.”顯示文字

android:phoneNumber

設定為電話號碼的輸入方式。

android:privateImeOptions

  提供額外的輸入法選項(字串格式)

依據輸入法而決定是否提供,如這裡 所見。自定義輸入法繼承
  InputMethodService。 

android:scrollHorizontally

設定文字超出TextView的寬度的情況下,是否出現橫拉條。

android:selectAllOnFocus

如果文字是可選擇的,讓他獲取焦點而不是將游標移動為

文字的開始位置或者末尾位置。

TextView中設定後無效果。

android:shadowColor

指定文字陰影的顏色,需要與shadowRadius一起使用。

參見TextView中此屬性的截圖。

android:shadowDx

設定陰影橫向座標開始位置。

android:shadowDy

設定陰影縱向座標開始位置。

android:shadowRadius

設定陰影的半徑。設定為0.1就變成字型的顏色了,

一般設定為3.0的效果比較好。

android:singleLine

設定單行顯示。如果和layout_width一起使用,

當文字不能全部顯示時,後面用“…”來表示。

如 android:text="test_ singleLine  " 

android:singleLine="true" android:layout_width="20dp"將只顯示“t…”

如果不設定singleLine或者設定為false,文字將自動換行

android:text

設定顯示文字.

android:textAppearance

設定文字外觀。如“?android:attr/textAppearanceLargeInverse

這裡引用的是系統自帶的一個外觀,?表示系統是否有這種外觀,

否則使用預設的外觀。可設定的值如 下:textAppearanceButton/textAppearanceInverse/textAppearanceLarge 

/textAppearanceLargeInverse/textAppearanceMedium/

textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse

android:textColor

設定文字顏色

android:textColorHighlight

被選中文字的底色,預設為藍色

android:textColorHint

設定提示資訊文字的顏色,預設為灰色。與hint一起使用。

android:textColorLink

文字連結的顏色.

android:textScaleX

設定文字之間間隔,預設為1.0f。參見TextView的截圖。

android:textSize

設定文字大小,推薦度量單位”sp”,如”15sp”

android:textStyle

設定字形[bold(粗體) 0, italic(斜體) 1,  bolditalic(又粗又斜) 2] 可以設定一個或多個,用“|”隔開

android:typeface

  設定文字字型,必須是以下常量值之一:normal 0, sans 1, serif 2, monospace(等寬字型) 3]

android:height

設定文字區域的高度,支援度量單位:px(畫素)/dp/sp/in/mm(毫米)

android:maxHeight

設定文字區域的最大高度

android:minHeight

設定文字區域的最小高度

android:width

設定文字區域的寬度,支援度量單位:px(畫素)/dp/sp/in/mm(毫米),與layout_width的區別看這裡 。

android:maxWidth

設定文字區域的最大寬度

android:minWidth

設定文字區域的最小寬度

、主要方法介紹:

1.設定預設輸入法 

有時候為了提高使用者體驗,在彈出輸入法時需要設定預設的輸入狀態,比如單詞應用彈出輸入法時,輸入法最好是在英文輸入狀態下。如果是字典應用,彈出輸入法時最好是在中文輸入狀態下,Android並沒有提供設定預設的輸入狀態的介面,但我們可以通過如下方法一樣能夠達到想要的效果:

預設中文:

mEditText.setInputType(EditorInfo.TYPE_CLASS_TEXT);

預設英文:

mEditText.setInputType(EditorInfo.TYPE_TEXT_VARIATION_URI);

2.開啟和關閉輸入法

手動控制輸入法的開關狀態也能提升使用者體驗,比如:

  • 有的搜尋框會有一個清除按鈕,點選清除按鈕時就應該彈出輸入法,因為使用者清除搜尋內容的目的多數時候是需要輸入新的內容;

  • 執行搜尋時應該隱藏輸入法,因為顯示輸入法時會遮擋搜尋結果,使用者體驗不太好;

  • 鬧鐘來時或者有其它window彈出時應該隱藏輸入法,因為輸入法也是window,如果不隱藏可能導致輸入法遮擋住了其它window等使用者體驗不太友好的問題。

開啟輸入法:

    private void open(Context context, View editText){
        InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.showSoftInput(editText, 0);
    }

關閉輸入法:

    private void close(Context context, View editText){
        InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    }

3.監聽EditText的輸入狀態

  • 類似新浪微博,在輸入內容時會提示還可以輸入多少字;

  • 有的搜尋引擎,輸入內容時實時顯示搜尋結果;

  • 有的輸入框有輸入長度限制,輸入內容超過長度限制時彈出提示資訊。

上面這些都可以通過監聽EditText的輸入狀態來實現,具體實現方式如下:

    mInputEditTxt.addTextChangedListener(new TextWatcher() {

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }   

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                System.out.println("監聽EditText輸入內容的變化,在這裡可以監聽輸入內容的長度。");
            }

            @Override
            public void afterTextChanged(Editable s) {
                System.out.println("這裡可以實現所輸即所得,使用者輸入的同時可以立即在這裡根據輸入內容執行操作,顯示搜尋結果!");
            }

        });

4.監聽輸入法中的回車按鈕

比如搜狗輸入法的右下角有一個回車按鈕,我們希望使用者點選它時也執行確認功能,可以通過監聽EditText的按鍵點選事件來實現:

       /**
         * 監聽輸入法按鍵
         *
         */
        mInputEditTxt.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) {
                    System.out.println("手指彈起時執行確認功能");
                    return true;
                }
                return false;
            }
        });

5.改變輸入法中回車按鈕的顯示內容

如果回車按鈕是執行搜尋功能,則回車按鈕上顯示”搜尋”,如果是執行傳送功能,則顯示”傳送”,如果是下一步,則顯示”下一步”。

實現這個功能需要呼叫EditText的setImeOptions方法:

  /**
    *
    * IME_ACTION_SEARCH 搜尋
    * IME_ACTION_SEND 傳送
    * IME_ACTION_NEXT 下一步
    * IME_ACTION_DONE 完成
    */
    mInputEditTxt.setImeOptions(EditorInfo.IME_ACTION_SEARCH);

6.限制輸入內容

有時候我們根本就不想使用者輸入一些雜七雜八的內容,因為這需要程式針對輸入的內容做各種處理,如果處理不當還會有好多不可預見的問題,索性在輸入內容時就禁止使用者輸入一些非法字元,這可以通過下面的方式實現,新建一個類InputTxtFilter:

public class InputTxtFilter {
        public static final int INPUT_TYPE_EN = 0x01;
        public static final int INPUT_TYPE_CH = 0x02;
        private static final String[] SPELL = new String[]{
                "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
                "ā", "á", "ǎ", "à", "ō", "ó", "ǒ", "ò", "ē", "é", "ě", "è", "ī", "í", "ǐ", "ì", "ū", "ú", "ǔ", "ù", "ǖ", "ǘ", "ǚ", "ǜ", "ü"
        };
        private static char[] chineseParam = new char[]{'」', ',', '。', '?', '…', ':', '~', '【', '#', '、', '%', '*', '&', '$', '(', '‘', '’', '“', '”', '『', '〔', '{', '【'
                , '¥', '£', '‖', '〖', '《', '「', '》', '〗', '】', '}', '〕', '』', '”', ')', '!', ';', '—'};

        private InputTxtFilter() {

        }

        public static void inputFilter(final Context context, final EditText editText, final int type, final int inputLimit) {
            InputFilter[] filters = new InputFilter[1];
            filters[0] = new InputFilter.LengthFilter(inputLimit) {
                public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                    boolean isRightCharater = false;
                    if (type == INPUT_TYPE_EN) {
                        isRightCharater = isLetter(source.toString());
                    } else if (type == INPUT_TYPE_CH) {
                        isRightCharater = isChineseWord(source.toString());
                    }
                    if (!isRightCharater || dest.toString().length() >= inputLimit) {
                        return "";
                    }
                    return source;
                }
            };
            editText.setFilters(filters);
        }


        /**
         * 檢測String是否全是中文
         */
        public static boolean isChineseWord(String name) {
            boolean res = true;
            char[] cTemp = name.toCharArray();
            for (int i = 0; i < name.length(); i++) {
                if (!isChinese(cTemp[i])) {
                    res = false;
                    break;
                }
            }
            return res;
        }


        /**
         * 是否為英文字母
         */
        public static boolean isLetter(String inputStr) {
            char[] inputArray = inputStr.toCharArray();
            List<String> spellList = Arrays.asList(SPELL);
            for (char input : inputArray) {
                if (!spellList.contains(input + "")) {
                    return false;
                }
            }
            return true;
        }


        /**
         * 判定輸入漢字
         */
        public static boolean isChinese(char c) {
            for (char param : chineseParam) {
                if (param == c) {
                    return false;
                }
            }
            Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
            if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
                    || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
                    || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
                    || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
                    || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
                    || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
                return true;
            }
            return false;
        }
    }

在初始化EditText時,呼叫InputTxtFilter的inputFilter方法,傳入輸入長度限制、輸入內容的型別限制等即可,eg:

InputTxtFilter.inputFilter(this, mInputEditTxt, InputTxtFilter.INPUT_TYPE_EN, 5);

7.遮蔽EditText的複製、貼上功能

在低版本的Android SDK中,如果對EditText的輸入長度有限制時,長按EditText並將選中的內容拖動到EditText輸入框中,如果這時候的長度超過了EditText的輸入長度限制,程式會直接崩潰掉,在高版本的Android SDK中這個問題已經改了,如果出現上面的情況會直接清空輸入框中的內容,為了避免這種討厭的問題,我們可以遮蔽EditText的複製和貼上功能,只需要遮蔽EditText的長按響應即可:

       /**
         * 遮蔽複製、貼上功能
         *
         */
        mInputEditTxt.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

            public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
                return false;
            }


            public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
                return false;
            }

            public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
                return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode mode) {

            }
        });
        mInputEditTxt.setLongClickable(false);