软键盘是否可见有办法判断吗?

17

有没有办法判断软键盘是否在一个activity中显示?

我尝试过:

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

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

那么是否有其他方法来检查这个问题呢?

谢谢

4个回答

13
根据这个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. "check Configuration Changes" 只适用于手动输入。

我相信这是解决这个问题的唯一方案。 - Mina Wissa
1
这是目前在Android 2.2上的最佳解决方案。很遗憾,没有API可以检测软键盘(或者说获取其滑动动画的句柄),这真的很麻烦。感谢您的回答! - Mason Lee
为什么我现在才看到这个?!我花了很多时间尝试使用onMeasure、onLayoutChange等等,但这是唯一有效的解决方案。而且它还是最简单的!非常感谢Doraemon,哦不,是@DiveInto。:p - KarenAnne
谢谢,你救了我的一天。我在使用RecyclerView创建聊天应用程序时卡了几个小时。 - Ali Azhar

4
您可以使用dumpsys shell命令来检测软件键盘的状态和坐标。
因为dumpsys需要permission.android.DUMP权限,这是系统应用程序权限,您有两个选择:1.使用已Root的设备授予此权限;2.使用adb覆盖该问题,如我在另一个答案中所述。
现在运行以下命令:dumpsys window InputMethod | grep "mHasSurface",以获取您要查找的数据。

-1

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

@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();
        }
    }

-2
请检查您的活动的“配置更改”。
这是针对您的“AndroidManifest.xml”。
这是针对您的“Activity”类http://developer.android.com/reference/android/app/Activity.html#onConfigurationChanged(android.content.res.Configuration)
您需要@覆盖您的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();
    }
}

1
谢谢您的回复,但是当键盘出现或消失时它没有捕捉到任何变化。 - Mina Wissa
嗨,你应该搜索一个例子来看看,当在你的清单文件中设置android:configChanges="keyboardHidden"时,这将触发你调用的任何Activity中的onConfigurationChanged方法。如果你重写这个方法,你可以传递新的值给你的Activity,或者你可以获取当前的值。我的意思是,使用这个方法,你可以让你的应用程序监听像键盘可见性变化这样的事件,并在你的Activity中处理它们。 - yeradis
我刚刚更新了响应,添加了一个来自http://developer.android.com/guide/topics/resources/runtime-changes.html的示例,您将看到有关“自己处理配置更改”的更好信息。 - yeradis
谢谢,yeradis。我会检查并稍后告诉你。 - Mina Wissa
2
@yeradis 的 configChanges 只适用于硬键盘和方向更改,对软键盘无效。 - DiveInto
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接