在项目开发中,用到编辑框的地方经常涉及到要监听或者控制软键盘的显示/隐藏状态。本以为这是很容易解决的一个小问题,没想到当初碰到这个问题才明白还得花点小心思才能整好。现将针对软键盘的显示/隐藏状态的监听/监控方法做一些总结,以备后用。
一、点击空白处隐藏软键盘
这是具有编辑框焦点的页面对输入法软键盘状态监听的一般需求和解决方法.
首先获得InputMethodManager:InputMethodManager manager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
监听点击:/**
* 点击监听
*/
@Override
public boolean onTouchEvent(MotionEvent event)
{
onHideSoftInput(event);
return super.onTouchEvent(event);
}
/**
* 点击空白处,关闭输入法软键盘
*/
public void onHideSoftInput(MotionEvent event)
{
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
if (getCurrentFocus() != null && getCurrentFocus().getWindowToken() != null)
{
manager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
}
}
二、popwindow与输入法软键盘的结合
先说下自己想实现的效果:点击顶部按钮,打开编辑菜单popwindow并自动弹出软键盘;再次点击顶部按钮,或者点击编辑菜单popwindow上面的底部按钮,关闭菜单并隐藏软键盘;菜单打开状态,点击返回键,若菜单已显示先关闭软键盘,再点击则关闭菜单。
大致效果图如下:
1.重写根布局,监听根布局高度变化
对于这个需求,简单的用上面第一点的方法是无效的。这里没法直接通过getCurrentFocus()方法判断页面是否获取焦点来控制,需要通过对popwindow的高度变化进行判断。同时也试过下面的方法,同样无效。
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
boolean isOpen=imm.isActive();//isOpen若返回true,则表示输入法打开
popwindow的根布局我这里用的是RelativeLayout,RelativeLayout类可以通过重写onSizeChanged方法来监听布局大小变化。重写一个RelativeLayout类便实现了对popwindow的高度变化的监听了。
代码如下:/**
* 监听输入法软键盘显示状态的自定义RelativeLayout
*
* @author zeng
*
*/
public class ResizeRelativeLayout extends RelativeLayout
{
public ResizeRelativeLayout(Context context, AttributeSet attrs)
{
super(context, attrs);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
super.onSizeChanged(w, h, oldw, oldh);
if (mListener != null)
{
mListener.OnResizeRelative(w, h, oldw, oldh);
}
}
// 监听接口
private OnResizeRelativeListener mListener;
public interface OnResizeRelativeListener
{
void OnResizeRelative(int w, int h, int oldw, int oldh);
}
publi