Android EditText 不得不说的InputFilter、TextWatcher、ActionMode.Callback、OnEditorActionListener
開發過程中,輸入內容往往會遇到各種奇葩的限制輸入1、輸入內容的限定editText.setFilters()?
editText.setFilters(new InputFilter[]{new InputFilter() {/*** editText 內容不變處理* @param source 變化的字符串* @param start 變化字符的首字符下標* @param end 變化字符的尾字符下* @param dest 帶光標的字符串* @param dstart 光標的起始位置* @param dend 光標的結束位置* @return 返回null,表示可正常添加source字符串;返回"",表示不變動原字符*/@Overridepublic CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {//假設,我們限制 "\n"String sourceStr = source.toString();if ("\n".equals(sourceStr)){//內容包含\nreturn ""; //不變動原字符}return null; //添加source字符串}}});2、判斷編輯框是否有內容等,可以通過設置editText.addTextChangedListener()
editText.addTextChangedListener(new TextWatcher() {/*** 內容改變前調用* @param s 修改之前的文字* @param start 字符串中即將發生修改的位置* @param count 字符串中即將被修改的文字的長度。如果是新增的話則為0* @param after 被修改的文字修改之后的長度。如果是刪除的話則為0*/@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}/*** 內容改變過程中調用* @param s 改變后的字符串* @param start 有變動的字符串的位置* @param before 被改變的字符串長度,如果是新增則為0* @param count 添加的字符串長度,如果是刪除則為0*/@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}/*** 內容改變后調用* @param s*/@Overridepublic void afterTextChanged(Editable s) {}});3、屏蔽EditText的復制、粘貼功能editText.setLongClickable(false)、editText.setCustomSelectionActionModeCallback()
editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {@Overridepublic boolean onCreateActionMode(ActionMode mode, Menu menu) {return false;}@Overridepublic boolean onPrepareActionMode(ActionMode mode, Menu menu) {return false;}@Overridepublic boolean onActionItemClicked(ActionMode mode, MenuItem item) {return false;}@Overridepublic void onDestroyActionMode(ActionMode mode) {}});4、鍵盤確認按鈕或者搜索功能editText.setOnEditorActionListener()
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {@Overridepublic boolean onEditorAction(TextView v, int actionId, KeyEvent event) {//actionId 事件id 如:actionId == EditorInfo.IME_ACTION_SEARCH 搜索功能return false;}});?
5、監聽鍵盤事件 editText.setOnKeyListener()?
editText.setOnKeyListener(new View.OnKeyListener() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {return false;}});ps:調用軟鍵盤搜索的setOnKeyListener方法事件執行兩次(setOnKeyListener之所以執行兩次就是因為down和up占用)
6、editText.setKeyListener()限制輸入
限定只能輸入數字:editText.setKeyListener(DigitsKeyListener.getInstance("0123456789"))
系統定義好的:
BaseKeyListener
DateKeyListener
DateTimeKeyListener
DialerKeyListener
DigitsKeyListener
MultiTapKeyListener,
NumberKeyListener
QwertyKeyListener
TextKeyListener,
TimeKeyListener
?
//自定義限制 editText.setKeyListener(new KeyListener() {@Overridepublic int getInputType() {return 0;}@Overridepublic boolean onKeyDown(View view, Editable text, int keyCode, KeyEvent event) {return false;}@Overridepublic boolean onKeyUp(View view, Editable text, int keyCode, KeyEvent event) {return false;}@Overridepublic boolean onKeyOther(View view, Editable text, KeyEvent event) {return false;}@Overridepublic void clearMetaKeyState(View view, Editable content, int states) {}}); 輸入內容限制 editText.setInputType(EditorInfo.TYPE_CLASS_TEXT); 內容會一行可滑動顯示 //輸入類型為沒有指定明確的類型的特殊內容類型editText.setInputType(InputType.TYPE_NULL);//輸入類型為普通文本editText.setInputType(InputType.TYPE_CLASS_TEXT);//輸入類型為數字文本editText.setInputType(InputType.TYPE_CLASS_NUMBER);//輸入類型為電話號碼editText.setInputType(InputType.TYPE_CLASS_PHONE);//輸入類型為日期和時間editText.setInputType(InputType.TYPE_CLASS_DATETIME);//輸入類型為{@link#TYPE_CLASS_DATETIME}的缺省變化值,允許輸入日期和時間。editText.setInputType(InputType.TYPE_DATETIME_VARIATION_NORMAL);//輸入類型為{@link#TYPE_CLASS_DATETIME}的缺省變化值,只允許輸入一個日期。editText.setInputType(InputType.TYPE_DATETIME_VARIATION_DATE);//輸入類型為{@link#TYPE_CLASS_DATETIME}的缺省變化值,只允許輸入一個時間。editText.setInputType(InputType.TYPE_DATETIME_VARIATION_TIME);//輸入類型為決定所給文本整體類的位掩碼editText.setInputType(InputType.TYPE_MASK_CLASS);//輸入類型為提供附加標志位選項的位掩碼editText.setInputType(InputType.TYPE_MASK_FLAGS);//輸入類型為決定基類內容變化的位掩碼editText.setInputType(InputType.TYPE_MASK_VARIATION);//輸入類型為小數數字,允許十進制小數點提供分數值。editText.setInputType(InputType.TYPE_NUMBER_FLAG_DECIMAL);//輸入類型為數字是帶符號的,允許在開頭帶正號或者負號editText.setInputType(InputType.TYPE_NUMBER_FLAG_SIGNED);//輸入類型為{@link#TYPE_CLASS_NUMBER}的缺省變化值:為純普通數字文本editText.setInputType(InputType.TYPE_NUMBER_VARIATION_NORMAL);//輸入類型為{@link#TYPE_CLASS_NUMBER}的缺省變化值:為數字密碼editText.setInputType(InputType.TYPE_NUMBER_VARIATION_PASSWORD);//輸入類型為自動完成文本類型editText.setInputType(InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE);//輸入類型為自動糾正文本類型editText.setInputType(InputType.TYPE_TEXT_FLAG_AUTO_CORRECT);//輸入類型為所有字符大寫editText.setInputType(InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS);//輸入類型為每句的第一個字符大寫editText.setInputType(InputType.TYPE_TEXT_FLAG_CAP_SENTENCES);//輸入類型為每個單詞的第一個字母大寫editText.setInputType(InputType.TYPE_TEXT_FLAG_CAP_WORDS);//輸入多行文本editText.setInputType(InputType.TYPE_TEXT_FLAG_IME_MULTI_LINE);//進行輸入時,輸入法無提示editText.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);//輸入一個短的,可能是非正式的消息,如即時消息或短信。editText.setInputType(InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE);//輸入長內容,可能是正式的消息內容,比如電子郵件的主體editText.setInputType(InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE);//輸入文本以過濾列表等內容editText.setInputType(InputType.TYPE_TEXT_VARIATION_FILTER);//輸入一個電子郵件地址editText.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);//輸入電子郵件主題行editText.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT);//輸入一個密碼editText.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);//輸入老式的普通文本editText.setInputType(InputType.TYPE_TEXT_VARIATION_NORMAL);//輸入人名editText.setInputType(InputType.TYPE_TEXT_VARIATION_PERSON_NAME);//輸入郵寄地址editText.setInputType(InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS);//輸入語音發音輸入文本,如聯系人拼音名稱字段editText.setInputType(InputType.TYPE_TEXT_VARIATION_PHONETIC);//輸入URIeditText.setInputType(InputType.TYPE_TEXT_VARIATION_URI);//輸入對用戶可見的密碼editText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);//輸入網頁表單中的文本editText.setInputType(InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT);//輸入網頁表單中的郵件地址editText.setInputType(InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS);//輸入網頁表單中的密碼editText.setInputType(InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD);?
?
?
?
?
總結
以上是生活随笔為你收集整理的Android EditText 不得不说的InputFilter、TextWatcher、ActionMode.Callback、OnEditorActionListener的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [css] 使用纯css来创建一个滑块
- 下一篇: 中文文本纠错工具推荐:pycorrect