您好首先感谢您提出一个有趣的问题。它让我尝试了代码。在这里,我正在描述我的解决方案。
为了找到解决方案,我必须知道两件事
1.如何检测软键盘是否可见
2.如何设置软键盘可见或隐藏。
经过一番搜索后,我在以下步骤中得到了解决方案,
我意识到检测softkeyboardstate
(可见/隐藏)的最佳解决方案是使用ViewTreeObserver。如果您不知道,我直接指向一个如此答案以了解它。这是链接。
并设置softkeyboardstate
我刚刚使用的Window.setSoftInputMode
方法。
并了解用户交互我覆盖onUserInteraction
方法
保留了两个标志。一个标志是保存keyboardstate
另一个是知道应用程序是否进入后台
代码:
1. 变量声明
int lastDiff = 0;
volatile boolean flag = false;
volatile int flag2 = 0;
2.ViewTreeObserver
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(
new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect r = new Rect();
activityRootView.getWindowVisibleDisplayFrame(r);
int heightDiff = activityRootView.getRootView()
.getHeight() - (r.bottom - r.top);
if (lastDiff == heightDiff)
return;
lastDiff = heightDiff;
Log.i("aerfin","arefin "+lastDiff);
if (heightDiff > 100) { // if more than 100 pixels, its
// probably a keyboard...
flag2 = 0;
} else {
if (flag == false)
flag2 = 1;
}
}
});
3.处理用户交互
@Override
public void onUserInteraction() {
super.onUserInteraction();
flag = true;
}
4. 最后onPause
和onResume
@Override
protected void onPause() {
super.onPause();
flag = true;
}
@Override
protected void onResume() {
flag = false;
switch (flag2) {
case 0:
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
break;
case 1:
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
break;
default:
break;
}
super.onResume();
}
解释:
这里我使用了两个标志(flag2
和flag
)。flag2
保留keyboardstate
并flag
保留应用程序是否进入后台或是否有任何用户交互。flag
之所以使用,是因为当应用程序进入后台时,首先它会隐藏键盘。从上面的代码中可以很容易地理解其他事情。
测试:
在 s2(ics)、desire s (ics)、galaxy y (2.3.6) 中测试
最后评论:
我写的代码很快,所以可能会错过一些其他的优化。也有可能出现特殊情况。如果屏幕因键盘以外的其他原因发生变化,则可能无法检测到键盘状态。