有没有办法判断软键盘是否显示?

时间:2011-03-28 10:13:32

标签: android

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

我试过

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

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

还有其他方法可以检查此问题。

感谢

4 个答案:

答案 0 :(得分:12)

根据此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。 “检查配置更改”仅适用于手持键盘。

答案 1 :(得分:3)

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

由于dumpsys需要permission.android.DUMP,这是系统应用程序权限,因此您有两种选择:1。使用root设备授予此权限。 2.使用adb中描述的dumpsys window InputMethod | grep "mHasSurface"覆盖问题。

现在,运行以下命令:{{1}}以获取您要查找的数据。

答案 2 :(得分:-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.HARDKEYBOARDHIDDEN_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();
        }
    }

答案 3 :(得分:-2)

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

这适用于 AndroidManifest.xml

这适用于您的活动http://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();
    }
}