Android textedit 背景,Android EditText 的使用及值得注意的地方
Android上有很多輸入法應用,每種輸入法都有各自的特點,輸入法多數時候是和EditText配合使用,結合我自己的親身實踐分享一下使用EditText過程中遇到的一些問題及解決方法。
設置默認輸入法
有時候為了提高用戶體驗,在彈出輸入法時需要設置默認的輸入狀態,比如單詞應用彈出輸入法時,輸入法最好是在英文輸入狀態下。如果是字典應用,彈出輸入法時最好是在中文輸入狀態下,Android并沒有提供設置默認的輸入狀態的接口,但我們可以通過如下方法一樣能夠達到想要的效果:
默認中文:
mEditText.setInputType(EditorInfo.TYPE_CLASS_TEXT);
默認英文:
mEditText.setInputType(EditorInfo.TYPE_TEXT_VARIATION_URI);
打開和關閉輸入法
手動控制輸入法的開關狀態也能提升用戶體驗,比如:
有的搜索框會有一個清除按鈕,點擊清除按鈕時就應該彈出輸入法,因為用戶清除搜索內容的目的多數時候是需要輸入新的內容;
執行搜索時應該隱藏輸入法,因為顯示輸入法時會遮擋搜索結果,用戶體驗不太好;
鬧鐘來時或者有其它window彈出時應該隱藏輸入法,因為輸入法也是window,如果不隱藏可能導致輸入法遮擋住了其它window等用戶體驗不太友好的問題。
打開輸入法:
privatevoidopen(Contextcontext,VieweditText){
InputMethodManagerinputMethodManager=(InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.showSoftInput(editText,0);
}
關閉輸入法:
privatevoidclose(Contextcontext,VieweditText){
InputMethodManagerinputMethodManager=(InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(editText.getWindowToken(),0);
}
監聽EditText的輸入狀態
類似新浪微博,在輸入內容時會提示還可以輸入多少字;
有的搜索引擎,輸入內容時實時顯示搜索結果;
有的輸入框有輸入長度限制,輸入內容超過長度限制時彈出提示信息。
上面這些都可以通過監聽EditText的輸入狀態來實現,具體實現方式如下:
mInputEditTxt.addTextChangedListener(newTextWatcher(){
@Override
publicvoidbeforeTextChanged(CharSequences,intstart,intcount,intafter){
}
@Override
publicvoidonTextChanged(CharSequences,intstart,intbefore,intcount){
System.out.println("監聽EditText輸入內容的變化,在這里可以監聽輸入內容的長度。");
}
@Override
publicvoidafterTextChanged(Editables){
System.out.println("這里可以實現所輸即所得,用戶輸入的同時可以立即在這里根據輸入內容執行操作,顯示搜索結果!");
}
});
監聽輸入法中的回車按鈕
比如搜狗輸入法的右下角有一個回車按鈕,我們希望用戶點擊它時也執行確認功能,可以通過監聽EditText的按鍵點擊事件來實現:
/**
* 監聽輸入法按鍵
*
* */
mInputEditTxt.setOnKeyListener(newOnKeyListener(){
@Override
publicbooleanonKey(Viewv,intkeyCode,KeyEventevent){
if(keyCode==KeyEvent.KEYCODE_ENTER&&event.getAction()==KeyEvent.ACTION_UP){
System.out.println("手指彈起時執行確認功能");
returntrue;
}
returnfalse;
}
});
改變輸入法中回車按鈕的顯示內容
如果回車按鈕是執行搜索功能,則回車按鈕上顯示”搜索”,如果是執行發送功能,則顯示”發送”,如果是下一步,則顯示”下一步”。
實現這個功能需要調用EditText的setImeOptions方法:
/**
*
* IME_ACTION_SEARCH 搜索
* IME_ACTION_SEND 發送
* IME_ACTION_NEXT 下一步
* IME_ACTION_DONE 完成
*/
mInputEditTxt.setImeOptions(EditorInfo.IME_ACTION_SEARCH);
限制輸入內容
有時候我們根本就不想用戶輸入一些雜七雜八的內容,因為這需要程序針對輸入的內容做各種處理,如果處理不當還會有好多不可預見的問題,索性在輸入內容時就禁止用戶輸入一些非法字符,這可以通過下面的方式實現,新建一個類InputTxtFilter:
publicclassInputTxtFilter{
publicstaticfinalintINPUT_TYPE_EN=0x01;
publicstaticfinalintINPUT_TYPE_CH=0x02;
privatestaticfinalString[]SPELL=newString[]{
"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",
"ā","á","ǎ","à","ō","ó","ǒ","ò","ē","é","ě","è","ī","í","ǐ","ì","ū","ú","ǔ","ù","ǖ","ǘ","ǚ","ǜ","ü"
};
privatestaticchar[]chineseParam=newchar[]{'」',',','。','?','…',':','~','【','#','、','%','*','&','$','(','‘','’','“','”','『','〔','{','【'
,'¥','£','‖','〖','《','「','》','〗','】','}','〕','』','”',')','!',';','—'};
privateInputTxtFilter(){
}
publicstaticvoidinputFilter(finalContextcontext,finalEditTexteditText,finalinttype,finalintinputLimit){
InputFilter[]filters=newInputFilter[1];
filters[0]=newInputFilter.LengthFilter(inputLimit){
publicCharSequence filter(CharSequencesource,intstart,intend,Spanneddest,intdstart,intdend){
booleanisRightCharater=false;
if(type==INPUT_TYPE_EN){
isRightCharater=isLetter(source.toString());
}elseif(type==INPUT_TYPE_CH){
isRightCharater=isChineseWord(source.toString());
}
if(!isRightCharater||dest.toString().length()>=inputLimit){
return"";
}
returnsource;
}
};
editText.setFilters(filters);
}
/**
* 檢測String是否全是中文
*
*/
publicstaticbooleanisChineseWord(Stringname){
booleanres=true;
char[]cTemp=name.toCharArray();
for(inti=0;i
if(!isChinese(cTemp[i])){
res=false;
break;
}
}
returnres;
}
/**
* 是否為英文字母
*
* */
publicstaticbooleanisLetter(StringinputStr){
char[]inputArray=inputStr.toCharArray();
ListspellList=Arrays.asList(SPELL);
for(charinput:inputArray){
if(!spellList.contains(input+"")){
returnfalse;
}
}
returntrue;
}
/**
* 判定輸入漢字
* @param c
*/
publicstaticbooleanisChinese(charc){
for(charparam:chineseParam){
if(param==c){
returnfalse;
}
}
Character.UnicodeBlockub=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){
returntrue;
}
returnfalse;
}
}
在初始化EditText時,調用InputTxtFilter的inputFilter方法,傳入輸入長度限制、輸入內容的類型限制等即可,eg:
InputTxtFilter.inputFilter(this, mInputEditTxt, InputTxtFilter.INPUT_TYPE_EN, 5);
屏蔽EditText的復制、粘貼功能
在低版本的Android SDK中,如果對EditText的輸入長度有限制時,長按EditText并將選中的內容拖動到EditText輸入框中,如果這時候的長度超過了EditText的輸入長度限制,程序會直接崩潰掉,在高版本的Android SDK中這個問題已經改了,如果出現上面的情況會直接清空輸入框中的內容,為了避免這種討厭的問題,我們可以屏蔽EditText的復制和粘貼功能,只需要屏蔽EditText的長按響應即可:
/**
* 屏蔽復制、粘貼功能
*
* */
mInputEditTxt.setCustomSelectionActionModeCallback(newActionMode.Callback(){
publicbooleanonCreateActionMode(ActionModeactionMode,Menumenu){
returnfalse;
}
publicbooleanonPrepareActionMode(ActionModeactionMode,Menumenu){
returnfalse;
}
publicbooleanonActionItemClicked(ActionModeactionMode,MenuItemmenuItem){
returnfalse;
}
@Override
publicvoidonDestroyActionMode(ActionModemode){
}
});
mInputEditTxt.setLongClickable(false);
總結
以上是生活随笔為你收集整理的Android textedit 背景,Android EditText 的使用及值得注意的地方的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Caffe学习笔记3——制作并训练自己的
- 下一篇: hql分页获取数据总数_最简洁的分页插件