Android Points

数字键盘与中英文键盘的切换

对于短信验证码的输入框,一般都是要求输入纯,但是如果给EditText仅仅设置了数字键盘,那么当日后短信验证码不再是纯数字的时候,用户就不能再切换中英文键盘切换了,所以一开始就给EditText设置了setInputType(InputType.TYPE_CLASS_TEXT),需用用户再点击一下才能进入数字键盘。测试人员测试时提出疑问,输入验证码时,是否能够立刻弹出数字键盘。找了很多资料,都没有找到首次弹出数值键盘,然后点击某个返回键,就可以切换其他键盘的实现,甚至在stackoverflow上面,有人回答说这样的交互方式无法实现,甚至向Android提出了 bug issue。
后来发现可以通过结合setInputTypesetOnEditorActionListener这两个方法实现用户的手动切换数字键盘与中英文键盘。
首先在初始化时,EditText设置setInputType(InputType.TYPE_CLASS_NUMBER)setImeOptions(EditorInfo.IME_ACTION_DONE),并且设置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的文本内容
                String text = VUtils.getViewText(getEditText());
                if (StrUtils.isTextEmpty(text)) {
                    //    文本内容为空,进行键盘的切换
                    //    首先隐藏键盘
                    VUtils.hideSoftKeyboard(getEditText());
                    //    获取EditText的inputType
                    int inputType = getEditText().getInputType();
                    if (inputType == InputType.TYPE_CLASS_NUMBER) {
                        //    如果数字键盘,则设置为中英文键盘 input type
                        getEditText().setInputType(InputType.TYPE_CLASS_TEXT);
                    } else if (inputType == InputType.TYPE_CLASS_TEXT) {
                        //    如果是中英文键盘,则设置为数字键盘 input type
                        getEditText().setInputType(InputType.TYPE_CLASS_NUMBER);
                    }
                    //    延时300毫秒后,EditText重新获取焦点并且弹出键盘
                    showSoftKeyBoardDelay(300l,new IConsume(){
                        @Override
                        public void accept(Object o) {
                            getEditText().requestFocus();
                            VUtils.showSoftKeyboard(getEditText());
                        }
                    });
                } else {
                    //    文本内容不为空,直接进行网络请求
                }

            }
        });
 

                            
                        
                    
                    
                    

你可能感兴趣的:(Android Points)