美文网首页
Android软键盘-显示隐藏软键盘

Android软键盘-显示隐藏软键盘

作者: Matt_Kill | 来源:发表于2018-06-13 15:09 被阅读0次

    本文参照 Android 软键盘的显示和隐藏,这样操作就对了进行整理修正

    Android软键盘系列:

    我们使用InputMethodManager来实现Android中显示和隐藏软键盘的工作,几句代码就可以完成显示和隐藏键盘的操作,比较简单。
    个人认为有两个点需要大家先留意一下:

    • 布局必须加载完成。在 onCreate() 中,如果立即调用 showSoftInput() 是不会生效的。想要在页面一启动的时候就弹出键盘,可以在 Activity 上,设置 android:windowSoftInputMode 属性来完成,或者做一个延迟加载,View.postDelayed() 也是一个解决方案。
    • 调用隐藏键盘的方法hideSoftInputFromWindow()时,第一个参数理论上需要传递弹出键盘相应的View的windowToken ,但实际情况是你只需要传递一个存在于当前布局 ViewTree 中,随意一个 View 的 windowToken就可以了

    以下进行详细介绍

    1. Show Keyboard

    先上代码

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

    调用InputMethodManager的showSoftInput()可以实现显示键盘,先来看看它的两个参数。


    image.png

    View: 使用软键盘就是为了输入,而输入就需要有接收输入内容的 View ,这里接收输入的 View ,最好是一个 EditText(但这不是必须的)。

    flags: flags 就是个标志位,从上面截图的方法签名上的文档上可以看到,它接收 0 或者 SHOW_INPYT_IMPLICIT 两个参数,但是实际上,它有第三个参数,另外一个是 SHOW_FORCED。

    以下是需要注意的使showSoftInput生效的关键点:

    • 第一个参数,最好是 EditText 或者它的子类。
      考虑到软键盘就是为了输入,EditText 就是一个接收输入的控件。而这不是绝对的,如果不是一个 EditText ,就必须要求这个 View 有两个属性,分别是:android:focusable="true" 和android:focusableInTouchMode="true"。
    • 第一个参数,必须是可获取焦点的,并且当前已经获取到焦点。
      EditText 默认是允许获取焦点的,但是假如布局中,存在多个可获取焦点的控件,就需要提前让我们传递进去的 View 获取到焦点。获取焦点可以使用 requestFocus() 方法。
    • 布局必须加载完成。
      在 onCreate() 中,如果立即调用 showSoftInput() 是不会生效的。想要在页面一启动的时候就弹出键盘,可以在 Activity 上,设置 android:windowSoftInputMode 属性来完成,或者做一个延迟加载,View.postDelayed() 也是一个解决方案。

    打开Activity时默认下打开或关闭软键盘,可以通过设置清单文件实现

     <activity
                android:name=".ActivityKeyboardActivity"
                android:windowSoftInputMode="stateVisible"
                />
    

    stateVisible:打开。
    stateHidden:关闭(默认)。

    2. Hide Keyboard

    先上代码

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

    同样来看看hideSoftInputFromWindow的两个参数。

    image.png
    IBinder: 可以直接传递一个 View.getWindowToken() 的 windowToken 对象就可以了
    flags: 隐藏软键盘的标志位,如果没有特殊要求的话,直接传递 0 就好了。
    注意: 第一参数理论上需要传递弹出键盘相应的View的windowToken ,但实际情况是你只需要传递一个存在于当前布局 ViewTree 中,随意一个 View 的 windowToken 就可以了
    image.png
    如上图所示,键盘是由第一个Edittext聚焦后弹出的,当点击Hide Keyboard按钮调用hideSoftInputFromWindow方法时,第一个参数传的是第二个Edittext的windowToken ,但也能把键盘隐藏掉。

    3. 切换键盘的弹出和隐藏

    在 InputMethodManager 中,还提供了一个 toggleSoftInput() 方法,如同它的名字一样,它可以让软键盘在显示和隐藏之间切换。
    虽然这个方法,限制很少,但是我们基本上不会使用它。主要原因在于,它是一个开关的方法,会根据当前的状态做相反的操作。这就导致很多时候,我们在代码中,无法直接根据 InputMethodManager 提供的方法判断当前软键盘的显示状态,这样也就无法确定调用它的时候的效果了。

    4. 如何判断键盘是否弹出

    InputMethodManager 没有提供判断键盘是否弹出的调用方法,如果想要监听键盘的弹出和收起,可以使用 ViewTreeObserver.OnGlobalLayoutListener 这个监听,来监听布局的调整,从而判断出键盘的弹出和隐藏。
    这一点我在Android软键盘-弹起时布局向上拉-登录界面时有提及,有兴趣的可以去看看。

    相关文章

      网友评论

          本文标题:Android软键盘-显示隐藏软键盘

          本文链接:https://www.haomeiwen.com/subject/zgfjeftx.html