數(shù)字鍵盤與中英文鍵盤的切換
對(duì)于短信驗(yàn)證碼的輸入框,一般都是要求輸入純,但是如果給EditText僅僅設(shè)置了數(shù)字鍵盤示启,那么當(dāng)日后短信驗(yàn)證碼不再是純數(shù)字的時(shí)候,用戶就不能再切換中英文鍵盤切換了领舰,所以一開始就給EditText設(shè)置了setInputType(InputType.TYPE_CLASS_TEXT)
夫嗓,需用用戶再點(diǎn)擊一下才能進(jìn)入數(shù)字鍵盤。測(cè)試人員測(cè)試時(shí)提出疑問(wèn)提揍,輸入驗(yàn)證碼時(shí)啤月,是否能夠立刻彈出數(shù)字鍵盤。找了很多資料劳跃,都沒(méi)有找到首次彈出數(shù)值鍵盤谎仲,然后點(diǎn)擊某個(gè)返回鍵,就可以切換其他鍵盤的實(shí)現(xiàn)刨仑,甚至在stackoverflow上面郑诺,有人回答說(shuō)這樣的交互方式無(wú)法實(shí)現(xiàn)夹姥,甚至向Android提出了 bug issue。
后來(lái)發(fā)現(xiàn)可以通過(guò)結(jié)合setInputType
和setOnEditorActionListener
這兩個(gè)方法實(shí)現(xiàn)用戶的手動(dòng)切換數(shù)字鍵盤與中英文鍵盤辙诞。
首先在初始化時(shí)辙售,EditText設(shè)置setInputType(InputType.TYPE_CLASS_NUMBER)
和setImeOptions(EditorInfo.IME_ACTION_DONE)
,并且設(shè)置setOnEditorActionListener
飞涂,在TextView.OnEditorActionListener
的方法boolean onEditorAction(TextView v, int actionId, KeyEvent event)
里面處理切換鍵盤的邏輯旦部。具體思路如下:
getEditText().setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
// 獲取EditText的文本內(nèi)容
String text = VUtils.getViewText(getEditText());
if (StrUtils.isTextEmpty(text)) {
// 文本內(nèi)容為空,進(jìn)行鍵盤的切換
// 首先隱藏鍵盤
VUtils.hideSoftKeyboard(getEditText());
// 獲取EditText的inputType
int inputType = getEditText().getInputType();
if (inputType == InputType.TYPE_CLASS_NUMBER) {
// 如果數(shù)字鍵盤较店,則設(shè)置為中英文鍵盤 input type
getEditText().setInputType(InputType.TYPE_CLASS_TEXT);
} else if (inputType == InputType.TYPE_CLASS_TEXT) {
// 如果是中英文鍵盤士八,則設(shè)置為數(shù)字鍵盤 input type
getEditText().setInputType(InputType.TYPE_CLASS_NUMBER);
}
// 延時(shí)300毫秒后,EditText重新獲取焦點(diǎn)并且彈出鍵盤
showSoftKeyBoardDelay(300l,new IConsume<Object>(){
@Override
public void accept(Object o) {
getEditText().requestFocus();
VUtils.showSoftKeyboard(getEditText());
}
});
} else {
// 文本內(nèi)容不為空梁呈,直接進(jìn)行網(wǎng)絡(luò)請(qǐng)求
}
}
});