android 软键盘弹出和消去

调用键盘的方法

    public static void showKeyboard(Activity activity, View view) {
        if (activity != null) {
            if (view != null) {
                view.requestFocus();
            }
            InputMethodManager imm = (InputMethodManager)
                    activity.getSystemService(Context.INPUT_METHOD_SERVICE);
            if (imm != null) {

                imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
            }
        }
    }

    public static void hideKeyboard(Activity activity) {
        if (activity != null) {
            InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
            if (imm != null && activity.getCurrentFocus() != null) {
                imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
                activity.getCurrentFocus().clearFocus();
            }
        }
    }

    public static void hideKeyboard(Activity activity, View view) {
        if (activity != null) {
            if (view != null) {
                InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
                if (imm != null) {
                    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
                }
            } else {
                hideKeyboard(activity);
            }
        }
    }

windowSoftInputMode

  1. “stateUnspecified”
    默认值,只有输入框获取焦点,会弹出。

  2. “stateUnchanged”
    不改变的意思,当前界面的软键盘状态,取决于上一个界面的软键盘状态,无论是隐藏还是显示。

  3. “stateHidden”
    用户选择activity时,软键盘总是被隐藏

  4. “stateAlwaysHidden”
    当该Activity主窗口获取焦点时,软键盘也总是被隐藏的

  5. “stateVisible”
    软键盘通常是可见的,即使在界面上没有输入框的情况下也可以强制召唤

  6. “stateAlwaysVisible”
    用户选择activity时,软键盘总是显示的状态。

    stateVisible与stateAlwaysVisible不同之处:

    如果设置A界面为stateVisible属性,如果当前的A界面键盘是显示的,跳转到下个界面B的时候,软键盘会因为输入框失去焦点而隐藏,这是返回A界面,键盘这个时候是隐藏的。
    如果设置A为stateAlwaysVisible,当前的A界面键盘是显示键盘,跳转到下个界面B,软键盘被隐藏的,这时候返回A界面,软键盘是会显示出来。
    stateAlwaysVisible:不管什么情况到达当前界面(正常跳转或者是上一个界面被用户返回),软键盘都是显示状态。

  7. “adjustUnspecified”
    默认设置,通常由系统自行决定是隐藏还是显示。

    系统会根据界面选择不同的模式,如果界面里面有可以滚动的控件,比如ScrowView,系统会减小可以滚动的界面的大小,从而保证即使软键盘显示出来了,也能够看到所有的内容。如果布局里面没有滚动的控件,那么软键盘可能就会盖住一些内容。

  8. “adjustResize”
    根据字面意思Resize,重新调整大小,即总是调整屏幕的大小以便留出软键盘的空间。

    对于有滑动控件的布局来说,显示效果和默认adjustUnspecified是一样的
    对于没有滑动控件的布局,默认属性时,整个布局是被顶上去,设置为adjustResize属性,布局的位置并没有发生什么变化。

  9. “adjustPan”
    当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。
    对于没有滚动控件的布局来说,这个其实就是默认的设置,如果我们选择的位置偏下,上面的标题栏和部分控件会被顶上去。

    不设置"adjust…"的属性,对于没有滚动控件的布局来说,采用的是adjustPan方式,而对于有滚动控件的布局,则是采用的adjustResize方式.

    stateVisible与stateAlwaysVisible不同之处。stateAlwaysHidden与stateHidden类似,选择stateAlwaysHidden,always一直隐藏输入法。

强制显隐

资源文件:

android:windowSoftInputMode="adjustPan"

强制隐藏:

        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        KeyboardUtils.hideKeyboard(getContext(),inputNumber);

强制显示:

        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        KeyboardUtils.showKeyboard(getContext(), inputNumber);

dialog 关键盘

封装的待用方法

    private void setSoftInputMode(boolean visible) {
        if (visible) {
            if (getWindow() != null) {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            }
        } else {
            if (getWindow() != null) {
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
            }
        }
    }
    public static void hideKeyboard(Activity activity, View view) {
        if (activity != null) {
            if (view != null) {
                InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
                if (imm != null) {
                    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
                }
            } else {
                hideKeyboard(activity);
            }
        }
    }

    public static void hideKeyboard(Activity activity) {
        if (activity != null) {
            InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
            if (imm != null && activity.getCurrentFocus() != null) {
                imm.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
                if (null != activity.getCurrentFocus()) {
                    activity.getCurrentFocus().clearFocus();
                }
            }
        }
    }

场景一:点击返回按钮,关闭关键软件盘和dialog

调用如下代码关闭软键盘:

                setSoftInputMode(false);
                KeyboardUtils.hideKeyboard(getActivity(), editText);
                dismiss();

可以成功关闭

场景二:网络请求成功后,关闭关键软件盘和dialog

请求:

				加载框显示:
				Loading.getInstance().show(getActivity());
	
				... 网络请求
				网络请求加载框关闭:
				Loading.getInstance().dismiss();
				
                setSoftInputMode(false);
                KeyboardUtils.hideKeyboard(getActivity(), editText);
                dismiss();

这种调用方法,没有办法关闭软键盘。是网络加载框的dialog影响导致的。

我在网络加载框的DialogInterface.OnDismissListener 中,监听网络加载框消去,再关闭我的dialog和软键盘,依然不能成功。

推荐:
Loading.getInstance().show(getActivity()); 调用之前就把软键盘关闭就好了~

合理弹出键盘

输入法只有第一次启动的时候弹出来合适

ContextUtil.getHandler().postDelayed(new Runnable() {
    @Override
    public void run() {
        //延后弹出键盘 避免输入框焦点被抢
        if(dataBinding != null){
            KeyboardUtils.showSoftInput(dataBinding.includeSearchTitle.edInput, ContextUtil.getGlobalActivity());
        }
    }
},200);

切到后台再切回来不要立即申请焦点,而是用户手动触发,否则会有问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风徐来辽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值