难点

Android 软键盘的弹出及关闭

2018-06-01  本文已影响0人  Batashi

一、弹出:
方法1(推荐,此种方式可以自动弹出,无需延迟):

getWindow().setSoftInputMode(WindowManager.LayoutParams
.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

方法2(此种方式需要延迟一段时间,等UI加载完毕之后方能生效。但这个加载时间因不同手机而无法统一。你的手机好点,可能100毫秒就加载完毕,我的手机差点,可能需要1000毫秒才能加载完成。因此无法保证一定能自动弹出软键盘):

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool
(1);
        scheduledExecutorService.schedule(new Runnable() {
            @Override
            public void run() {
                InputMethodManager inputManager =
                        (InputMethodManager) mContext.getSystemService
                    (Context.INPUT_METHOD_SERVICE);
                inputManager.showSoftInput(mNo1EdtTxt, 0);
            }
        }, 700, TimeUnit.MILLISECONDS);

方法3(推荐。原理同上,只是不需要自己写死延迟时间。因为不同手机UI加载完毕所需时间可能不一样,这种方法比较保险,总是在UI加载完毕之后弹出,灵活性较好。而方法2延迟时间是写死的700毫秒,有可能在一些性能比较差的手机,700毫秒内UI还无法加载完毕,因此无法自动弹出软键盘。也有可能因为手机性能太好,100毫秒就加载完UI,而后面的600毫秒就算白等了,灵活性、可靠性及用户体验都很差):

getWindow().getDecorView().post(() -> {
            InputMethodManager inputManager =
                    (InputMethodManager) mContext.getSystemService(
Context.INPUT_METHOD_SERVICE);
            inputManager.showSoftInput(mNo1EdtTxt, 0);
        });

二、关闭(如果是在Dialog中弹出的,则一定要在Dialog关闭前关闭软键盘;如果是在Activity中弹出的,则一定要在finish之前关闭软键盘):
方法1:

/**
     * 隐藏软键盘(无输入框或者说无法获取输入框。比如,微信支付时处于未登录状态,此时输入框
     * 是微信的,返回再隐藏键盘)
     * @param context
     */
    public static void hideSoftKeyboard(@NonNull Activity context)
    {
        View view = context.getWindow().peekDecorView();
        if (view != null) {
            InputMethodManager inputmanger = (InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
            inputmanger.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }

方法2(推荐):

/**
     * 隐藏软键盘(有输入框)
     * @param context
     * @param mEditText
     */
    public static void hideSoftKeyboard(@NonNull Context context, 
                    @NonNull EditText mEditText)
    {
        InputMethodManager inputmanger = (InputMethodManager) context
                 .getSystemService(Context.INPUT_METHOD_SERVICE);
        inputmanger.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
    }
上一篇下一篇

猜你喜欢

热点阅读