Android EditText的屬性和方法介紹使用及值得注意的點
一、EditView屬性詳細介紹:
屬性名稱 |
描述 |
android:utoLink |
設定是否當文字為URL連結/email/電話號碼/map時,文字顯示為可點選的連結。 可選值(none/web/email/phone/map/all)。 這裡只有在同時設定text時才自動識別連結,後來輸入的無法自動識別。 |
android:autoText |
自動拼寫幫助。這裡單獨設定是沒有效果的,可能需要其他輸入法輔助才行, 效果參見視訊 。 |
android:bufferType |
指定getText()方式取得的文字類別。選項editable 類似於StringBuilder可追加字元, 也就是說getText spannable 則可在給定的字元區域使用樣式,參見這裡1 、這裡2 。 |
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 |
設定text與drawable(圖片)的間隔,與drawableLeft drawableTop、drawableBottom一起使用,可設定為負數, 單獨使用沒有效果。 |
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鍵。 有如下值可設定:normal,actionUnspecified,actionNone,actionGo ,actionSearch,actionSend,actionNext,actionDone 可用’|’設定多個。 <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 |
設定文字的型別,用於幫助輸入法顯示合適的鍵盤型別。 有如下值設定:none、text、 textCapCharacters字母大小、 textCapWords單詞首字母大小、textCapSentences僅第一個字母大小、 textAutoCorrect、textAutoComplete自動完成、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 |
提供額外的輸入法選項(字串格式)。 依據輸入法而決定是否提供,如這裡 所見。自定義輸入法繼承 |
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);