【问题标题】:Is there a way to tell if the soft-keyboard is shown?有没有办法判断是否显示软键盘?
【发布时间】:2011-07-24 08:53:06
【问题描述】:

有没有办法判断软键盘是否显示在活动中?

我试过了

InputMethodManager manager = (InputMethodManager) 
getSystemService(getApplicationContext().INPUT_METHOD_SERVICE);
manager.isActive(v)

isActive 仅在第一次显示键盘之前返回 false,但如果 kb 出现然后关闭,isActive 也会返回 true。

那么有没有其他方法可以检查这个问题。

谢谢

【问题讨论】:

    标签: android


    【解决方案1】:

    据此POST

    您无法检测是否显示软键盘,但您可以通过知道您的活动的View 已调整大小来间接知道显示了软键盘。

    假设您有一个ListView,底部有一个EditText,当用户单击 EditText 后显示软键盘时,您希望转到列表底部。

    您需要实现ListView 的子类,然后在您的ListActivityActivityView 中使用它。

    public class ThreadView extends ListView {
    
        public ThreadView(Context context, AttributeSet attributeSet) {
            super(context, attributeSet);
        }
    
        @Override
        protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) {
            super.onSizeChanged(xNew, yNew, xOld, yOld);
    
            if (yOld > yNew) {
                setSelection(((ListAdapter) getAdapter()).getCount() - 1);
            }
        }
    }
    

    希望对你有帮助

    PS。 “检查配置更改”仅适用于手动键盘。

    【讨论】:

    • 我相信这是解决这个问题的唯一方法
    • 这是要走的路,至少在 Android 2.2 和迄今为止。没有用于检测软键盘的 API(就此而言,需要处理其上滑动画),这真的很痛苦。感谢您的回答!
    • 为什么我现在才看到这个?!花了很多时间尝试使用 onMeasure、onLayoutChange 等等。这是唯一有效的解决方案。也是最简单的!非常感谢哆啦A梦,哦,我的意思是,@DiveInto。 :p
    • 谢谢,你拯救了我的一天。在使用 recyclerView 创建聊天应用程序时坚持了几个小时。
    【解决方案2】:

    您可以使用dumpsys shell 命令检测软键盘的状态和坐标。

    因为dumpsys需要permission.android.DUMP,这是一个系统应用权限,你有两种选择:1.使用root设备来授予这个权限。 2. 使用adb 覆盖问题,如我的other answer 中所述。

    现在,运行以下命令:dumpsys window InputMethod | grep "mHasSurface" 以获取您要查找的数据。

    【讨论】:

      【解决方案3】:

      这是我的想法。它未经测试。

      @Override
          public void onConfigurationChanged(Configuration newConfig) {
              super.onConfigurationChanged(newConfig);   
      
              // Checks whether a keyboard is available which is not hard keyboard
              if ((newConfig.keyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO)&&(newConfig.keyboardHidden != Configuration.KEYBOARDHIDDEN_NO)) {
                  Toast.makeText(this, "soft keyboard visible", Toast.LENGTH_SHORT).show();
              } else if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_YES) {
              Toast.makeText(this, "soft keyboard hidden", Toast.LENGTH_SHORT).show();
              }
          }
      

      【讨论】:

        【解决方案4】:

        请检查您的活动的配置更改

        这适用于您的 AndroidManifest.xml

        这对于你的 Activityhttp://developer.android.com/reference/android/app/Activity.html#onConfigurationChanged(android.content.res.Configuration)

        您需要 @Override Activity 的公共方法 onConfigurationChanged(android.content.res.Configuration) 才能处理例如这些值:
        hardKeyboardHidden,
        键盘,
        keyboardHidden

        对于所有可能的值,请检查http://developer.android.com/reference/android/content/res/Configuration.html

        你会看到这样的东西:

        HARDKEYBOARDHIDDEN_NO   
        HARDKEYBOARDHIDDEN_UNDEFINED    
        HARDKEYBOARDHIDDEN_YES  
        KEYBOARDHIDDEN_NO   
        KEYBOARDHIDDEN_UNDEFINED    
        KEYBOARDHIDDEN_YES  
        KEYBOARD_12KEY  
        KEYBOARD_NOKEYS 
        KEYBOARD_QWERTY 
        KEYBOARD_UNDEFINED
        

        您还可以阅读以下内容:

        public int  hardKeyboardHidden // A flag indicating whether the hard keyboard 
                                       // has been hidden.
        public int  keyboard    The kind of keyboard attached to the device.
        public int  keyboardHidden  A flag indicating whether any keyboard is available.
        

        更新:

        这是我正在谈论的具体示例

        http://developer.android.com/guide/topics/resources/runtime-changes.html

            
        @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
        
            // Checks the orientation of the screen
            if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
                Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
            } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
                Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
            }
            // Checks whether a hardware keyboard is available
            if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
                Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show();
            } else if (newConfig.hardKeyboardHidden == 
                  Configuration.HARDKEYBOARDHIDDEN_YES) {
                Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show();
            }
        }
        

        【讨论】:

        • 感谢您的回复,但是当kb出现或消失时它没有捕捉到任何变化
        • 您好,您应该搜索示例以查看当您在清单上设置 android:configChanges="keyboardHidden" 时,这将在您调用的任何 Activity 中触发 onConfigurationChanged 方法。如果您覆盖该方法,您可以为您的活动传递新值,或者您可以获取当前值。我的意思是,使用它,您可以让您的应用程序侦听键盘可见性更改等事件并在您的 Activity 中处理它们。
        • 我刚刚更新了响应以添加来自 developer.android.com/guide/topics/resources/… 的示例,您将看到有关“自行处理配置更改”的更好信息
        • 谢谢yeradis,稍后我会检查并告诉你
        • @yeradis configChanges 仅适用于硬键盘和方向更改,不适用于软键盘
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-11
        相关资源
        最近更新 更多