EditText 集錦 - 開發中常用的用法及遇到的各種坑
前言
EditText ,文字輸入框,一個再熟悉不過的的控制元件,在開發當中,我們需要經常用到。這邊文章,主要是記錄 EditText 的常用用法,需要的時候可以直接複製張貼,提高效率。同時,本文章會持續更新,建議收藏起來。
常用的基本屬性
該片段的內容來自於
EditText屬性(API 24)
android:hint //設定hint提示文字
android:textColorHint //設定hint提示文字顏色
android:textColor //設定文字顏色
android:textSize //設定文字字型大小
android:textStyle //設定文字字型樣式,bold(加粗),italic(傾斜),normal(預設是正常字型).
android:numeric //控制EditText輸入數字的型別 decimal(浮點數),integer(正整數),signed(帶+ -號的整數).注意:該屬性在使用時提示已過時,建議使用android:inputType屬性替代.
android:singleLine //設定是否單行輸入 true(單行輸入),false(會自動換行).注意:該屬性在使用時提示已過時,建議使用android:maxLines="1"屬性替代.
android:password="true" //以密文的形式顯示輸入的文字.注意:該屬性在使用時提示已過時,建議使用android:inputType屬性替代.
android:textAlignment //設定EditText中文字顯示的位置,center(居中),inherit(預設,居左邊顯示),viewStart(居左顯示),viewEnd(居右顯示),textStart(居左顯示),textEnd(居右顯示).這裡需要注意的是最低支援的API版本是17,前兩個可以在API14中使用,而後面使用就會報紅線...
android:textColorHighlight //設定被選中字型的顏色.預設為 Theme 主題中的 “colorAccent”的顏色.
textCursorDrawable //設定被游標的顏色.預設為 Theme 主題中的 “colorAccent”的顏色.
android:textScaleX //設定文字的水平縮放係數.
android:typeface //設定hint提示文字的字型.normal(預設),monospace,sans,serif.這裡就不解釋了,大家試一下就能看出效果.
android:background //設定EditText背景."@null"設定背景為透明.當我們設定背景後,EditText的那條線就會消失.
android:textAppearance //設定文字的顏色,字型,大小和樣式.
android:digits //設定只接收指定的文字內容.
android:phoneNumber="true" //設定輸入電話號碼.注意:該屬性在使用時提示已過時,建議使用android:inputType屬性替代.
android:editable //設定EditText是否可以編輯.當你設定為true,會提示你該EditText已經是可編輯的.設定為false時會提示使用inputType替代.
android:inputType //設定文字的型別,用於幫助輸入法顯示合適的鍵盤型別.
android:maxLength //設定EditText最多接受的文字的個數.
android:lines //設定EditText顯示的行數,設定兩行就顯示兩行,即使第二行沒有資料.
android:lineSpacingExtra //設定行間距.
android:lineSpacingMultiplier //設定行間距的倍數. 如設定成1.5倍.
輸入法相關
設定預設輸入法
有時候為了提高使用者體驗,在彈出輸入法時需要設定預設的輸入狀態,比如單詞應用彈出輸入法時,輸入法最好是在英文輸入狀態下。如果是字典應用,彈出輸入法時最好是在中文輸入狀態下,Android 並沒有提供設定預設的輸入狀態的介面,但我們可以通過如下方法一樣能夠達到想要的效果:
預設中文:
mEditText.setInputType(EditorInfo.TYPE_CLASS_TEXT);
預設英文:
mEditText.setInputType(EditorInfo.TYPE_TEXT_VARIATION_URI)
EditText 預設獲取焦點
EditText 預設獲取焦點,並彈出鍵盤,這本來是預設的行為。但有些情況,會因為焦點被別的控制元件獲取了,我們又想讓它自動獲取焦點,並自動彈出鍵盤。這時候,可以採用下面的方法
/** * EditText獲取焦點並顯示軟鍵盤 */ public static void showSoftInputFromWindow(Activity activity, EditText editText) { editText.setFocusable(true); editText.setFocusableInTouchMode(true); editText.requestFocus(); //顯示軟鍵盤 activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); //如果上面的程式碼沒有彈出軟鍵盤 可以使用下面另一種方式 //InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE); // imm.showSoftInput(editText, 0); }
取消 EditText 預設獲取焦點的行為
在EditText的父級控制元件中找一個,新增這兩個屬性:
android:focusable="true" android:focusableInTouchMode="true"
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:focusable="true" android:focusableInTouchMode="true" ><!-- 這兩句是為了取消自動獲取焦點 --> <EditText android:id="@+id/search_edittext" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:background="@drawable/search_bar_edit_bg" android:drawableLeft="@drawable/search_bar_icon_normal" android:hint="搜尋" android:selectAllOnFocus="true" android:singleLine="true" </RelativeLayout>
監聽輸入法中的回車按鈕
比如, QQ, 訊飛,搜狗輸入法下面有個回車按鈕,有時候我們按下按鈕,希望立即提交內容。這時候,可以通過監聽輸入法按下的 key 來實現
mEt.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) { Log.i(TAG, "手指彈起時執行確認功能"); return true; } return false; } });
限制輸入框的輸入內容
監聽 EditText 的輸入狀態
- 像新浪微博一樣,提醒還可以輸入多少字
- 限制最多可以輸入多少字
這些都可以通過監聽 EditText TextChangedListener 實現
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) { Log.i(TAG, "監聽EditText輸入內容的變化,在這裡可以監聽輸入內容的長度。"); } @Override public void afterTextChanged(Editable s) { Log.i(TAG, "這裡可以實現所輸即所得,使用者輸入的同時可以立即在這裡根據輸入內容執行操作,顯示搜尋結果!"); } });
限制輸入多少字元
在開發當中,我們通常需要對 text 的輸入字元進行限制輸入,比如限制輸入 30 個字元,雖然我們可以直接呼叫 setMaxLength
方法來限制輸入,但是這樣會有一個問題,就是當你的 text 超過 30 個字元的時候,你呼叫 mEtText.setText ,這時候會報錯。因此,最好,還是採用如下的方法, addTextChangedListener 監聽文字變化,在字串變化的時候對文字長度進行擷取,
public static final int MAX_LEN = 30; if (!TextUtils.isEmpty(mValue)) { int len = Math.min(mValue.length(), MAX_LEN); mValue = mValue.substring(0, len); mEtText.setText(mValue); mEtText.setSelection(mValue.length()); } mEtText.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) { Editable text = mEtText.getText(); if (TextUtils.isEmpty(text)) { return; } if (text.length() > MAX_LEN) { mEtText.setText(text.subSequence(0, MAX_LEN)); mEtText.setSelection(mEtText.getText().length()); } } @Override public void afterTextChanged(Editable s) { } });
限制輸入內容
有時候,輸入框中,我們想限制輸入內容,比如禁止輸入表情,禁止輸入中文等,這時候,可以使用 editText.setFilters(filters) 的方法。下面,列舉了一些常用的限制。
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; } /** * 判定輸入漢字 * @param c */ 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; } }
**InputTxtFilter.inputFilter(this, mInputEditTxt, InputTxtFilter.INPUT_TYPE_EN, 5);**
常見的坑
Android:EditText設定密碼可見與不可見
//從密碼不可見模式變為密碼可見模式(行得通) et_password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); //從密碼可見模式變為密碼不可見模式(行不通) et_password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
解決方法 :動態修改TransformationMethod
//從密碼不可見模式變為密碼可見模式 et_password.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); //從密碼可見模式變為密碼不可見模式 et_password.setTransformationMethod(PasswordTransformationMethod.getInstance())
題外話
今天 214 情人節,你有物件了嗎?如果碰到心儀的人,大膽去追求吧。不要一直藏著掖著,這樣,在將來的某一天,你肯定會後悔的。
Android 技術人,希望讓你看到程式猿不同的一面,除了分享 Coding,,還有職場心得,面試經驗,學習心得,人生感悟等等。希望通過該公眾號,讓大家看到,我們不只會敲程式碼,我們還會。。。。。。

Android 技術人