Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 有没有办法判断是否显示了软键盘?_Android - Fatal编程技术网

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

Android 有没有办法判断是否显示了软键盘?,android,Android,有没有办法判断活动中是否显示了软键盘 我试过了 InputMethodManager manager = (InputMethodManager) getSystemService(getApplicationContext().INPUT_METHOD_SERVICE); manager.isActive(v) 但是isActive仅在第一次显示键盘之前返回false,但是如果kb出现然后被取消,则isActive也会返回true 那么有没有其他方法来检查这个问题呢 谢谢请检查活动的配置更

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

我试过了

InputMethodManager manager = (InputMethodManager) 
getSystemService(getApplicationContext().INPUT_METHOD_SERVICE);
manager.isActive(v)
但是isActive仅在第一次显示键盘之前返回false,但是如果kb出现然后被取消,则isActive也会返回true

那么有没有其他方法来检查这个问题呢

谢谢

请检查活动的配置更改

这适用于您的AndroidManifest.xml

这是你的活动课)

您需要@Override活动的公共方法onConfigurationChanged(android.content.res.Configuration)才能处理这些值:
硬键盘隐藏
键盘
键盘隐藏

对于所有可能的值,请检查

你会看到这样的东西:

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.
在这里,您还可以阅读以下内容:

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.
更新:

下面是我所说的一个具体的例子:

据此,

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

假设您有一个
列表视图
,在底部有一个
编辑文本
,当用户单击编辑文本后显示软键盘时,您希望转到列表的底部

您需要实现
列表视图
的子类,然后在
列表活动
活动
视图
中使用它

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.“检查配置更改”仅适用于手动键盘

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

因为dumpsys需要
权限.android.DUMP
,这是一个系统应用程序权限,所以您有两个选项:1。使用根设备授予此权限。2.如my中所述,使用
adb
覆盖问题


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

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

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

感谢您的回复,但当kb出现或消失时,它没有捕获任何更改。您好,您应该搜索并举例说明,当您在清单上设置android:configChanges=“keyboardHidden”时,这将在您调用的任何活动中触发OnConfiguration Changed方法。如果重写该方法,则可以为活动传递新值,也可以获取当前值。我的意思是,使用它,你可以让你的应用程序监听键盘可见性更改之类的事件,并在你的活动中处理它们。我刚刚更新了响应,添加了一个来自你的示例,你会看到关于“自己处理配置更改”的更好信息,谢谢yeradis,我查一下告诉你later@yeradis配置更改只适用于硬键盘和方向更改,而不适用于软键盘。我相信这是解决此问题的唯一解决方案。这是一条路,至少在Android 2.2和迄今为止是如此。这是一个真正的痛苦,因为没有用于检测软键盘的API(就这点而言,在它的向上滑动动画上获得一个控制柄)。谢谢你的回答!为什么我刚才才看到这个?!花了很多时间尝试使用onMeasure、onLayoutChange等。。这是唯一有效的解决方案。最简单的也是!多谢多啦a梦,哦,我是说,@DiveInto.:汉克斯,你救了我一天。在使用recyclerView创建聊天应用程序的过程中,这个问题困扰了数小时。