这是具有编辑框焦点的页面对输入法软键盘状态监听的一般需求和解决方法.
首先获得InputMethodManager:
先说下自己想实现的效果:点击顶部按钮,打开编辑菜单popwindow并自动弹出软键盘;再次点击顶部按钮,或者点击编辑菜单popwindow上面的底部按钮,关闭菜单并隐藏软键盘;菜单打开状态,点击返回键,若菜单已显示先关闭软键盘,再点击则关闭菜单。
对于这个需求,简单的用上面第一点的方法是无效的。这里没法直接通过getCurrentFocus()方法判断页面是否获取焦点来控制,需要通过对popwindow的高度变化进行判断。同时也试过下面的方法,同样无效。
通过对编辑窗口的根布局高度变化来判断软键盘是否处于显示状态,在接口方法OnResizeRelative(int w, int h, int oldw, int oldh)里实现对高度变化的判断。这里主要判断以下几种高度变化场景:
(1)布局的当前高度小于上一次的高度,即h < oldh,因为布局被软键盘顶上去了,高度变小了。这种场景同样适用于点击按钮第一次打开窗口时的场景,虽然点击按钮时,肉眼看到的是窗口一下就充满了大半个屏幕,也就是当前h > oldh(oldh = 0)。但事实上是,第一次打开窗口时,窗口菜单首先是充满整个屏幕然后再根据软键盘高度自动缩进的。以下是点击【打开/发送】按钮后,根布局的高度变化日志:
(2)还有一种特殊情况,就是三星输入法在软键盘初次打开时,输入字符后软键盘高度会产生变化,同时造成根布局高度变小;若再清除已输入的字符,此时软键盘高度变小,根布局高度变大。而这两种情况下,也就是h < oldh 或者 h > oldh时,软键盘都是处于显示状态。