自动弹出软键盘

开发过程中碰到测试提出要求,当进入有EditText输入界面时,这个EditText自动获取焦点,并弹出输入法软键盘。
自个儿摸索了很久,在网上也搜了很多代码,在代码中设置setFocusable(true);setFocusableInTouchMode(true);requestFocus();发现作用不大,在Fragment或者自定义控件中经常会失效。下面介绍两种可行的方法:
在进入界面时强制弹出,在onResume方法里面调用,以下为代码:

public static void showKeyBoard(final View v) {
        v.requestFocus();
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                InputMethodManager manager = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                manager.showSoftInput(v, InputMethodManager.SHOW_FORCED);
            }
        }, 100);
    }

然而在该方法过于暴力,使用过程中引发很多问题,比如按HOME键回桌面时软键盘并不会消失,需要在onPause中强制隐藏软键盘

public static void hideKeyBoard(final View v) {
        InputMethodManager manager = (InputMethodManager) v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        if (manager.isActive()) {
            manager.hideSoftInputFromWindow(v.getWindowToken(), 0);
        }
    }

后来经同事说起,发现可以用模拟点击的方法,代码如下:

private void analogClick(View v) {
        Log.d(TAG, "-----> analog");
        Rect rect = new Rect();
        v.getGlobalVisibleRect(rect);
        v.requestFocus();

        long uptimeMillis = SystemClock.uptimeMillis();
        MotionEvent obtain = MotionEvent.obtain(uptimeMillis, uptimeMillis, 0, (float)v.getWidth(), (float) v.getHeight(), 0);
        MotionEvent obtain1 = MotionEvent.obtain(uptimeMillis, uptimeMillis, 1, (float)v.getWidth(), (float) v.getHeight(), 0);

        editUserName.onTouchEvent(obtain);
        editUserName.onTouchEvent(obtain1);
    }

注意,使用此方法需要在view绘制完成之后才产生作用,建议设置一个延时。

你可能感兴趣的:(自动弹出软键盘)