软键盘的显示和隐藏监听,在项目中大大小小都会需要,虽然网上也有很多例子,这里是给使用的时候一些注意
首先了解下软键盘使用的模式的:
【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
这里我们要监听页面的变化需要在AndroidManifes的该activity配置adjustResize这个属性:android:windowSoftInputMode="adjustResize"
//用于软键盘的监听,这个是activity根布局
private View root_layout;
//屏幕高度
private int screenHeight = 0;
//软件盘弹起后所占高度阀值
private int keyHeight = 0;
//获取屏幕高度
screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();
//阀值设置为屏幕高度的1/3
keyHeight = screenHeight/3;
root_layout.addOnLayoutChangeListener(this);
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
LogUtil.debugE("now",left+"-"+top+"-"+right+"-"+bottom);
LogUtil.debugE("old",oldLeft+"-"+oldTop+"-"+oldRight+"-"+oldBottom);
if (oldBottom != 0 && bottom != 0 && (oldBottom - bottom > 0)) {
Toast.makeText(PersonalMsgActivity.this, "监听到软键盘弹起...", Toast.LENGTH_SHORT).show();
} else if (oldBottom != 0 && bottom != 0 && (bottom - oldBottom > 0)) {
Toast.makeText(PersonalMsgActivity.this, "监听到软件盘关闭...", Toast.LENGTH_SHORT).show();
}
}
但是我在我手机上测试有个问题:
当这个editview控件首次获取焦点的时候,editview会被往上顶,也就是界面压缩了,按下软键盘的隐藏键,隐藏后,第二次再去点击,就被完全挡住了,这可能是焦点还在,
但发现还是不能解决我的问题.本来想通过监听软键盘的显示和隐藏,来处理editview的焦点事件,隐藏就让它失去焦点,显示就让显示焦点,
最后发现使用直接使用scrollview就可以搞定了,不用这么复杂.不过我还是迷迷糊糊.