我已经花费了几个小时来解决这个问题,但我找不到一种方法来确定键盘是否显示。
我看到了很多关于这个问题的问题和答案,这取决于容器布局的高度变化。因此,当(例如)Edittext获取焦点并且结果是完整高度布局和其视图的更改时,不能精确地检测键盘的打开。
我看到了很多关于这个问题的问题和答案,这取决于容器布局的高度变化。因此,当(例如)Edittext获取焦点并且结果是完整高度布局和其视图的更改时,不能精确地检测键盘的打开。
解决方案1: 我通过从所有EditText中删除焦点并在Edittext获得焦点时更改我不需要它们显示的视图的可见性(提供可用空间以防止视图混乱),因此我有足够的时间删除冗余视图。
但是,不可能检测到何时要求关闭键盘以使视图可见。
如果我使用第2段中提到的常见方法来检测键盘关闭,它将失败我的“解决方案1”。
我现在唯一的想法是通过监视负责键盘关闭的按键来检测键盘关闭,但我无法在onKeyDown方法中检测它。
那么我该如何监控这个关键点呢?
任何指南和想法都将不胜感激。提前致谢。
最终解决方案:
感谢@Nick Cardoso,我的最终解决方案是使用onTouchListener
来检测键盘的打开情况,并结合Nick的关闭方案。
这是用于编辑文本的onTouchListener:
View.OnTouchListener TouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
Container.getViewTreeObserver().removeOnGlobalLayoutListener(gll);
recyclerView.setVisibility(View.GONE);
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Container.getViewTreeObserver().addOnGlobalLayoutListener(gll);
}
}, 100);
}
return false;
}
};
ViewTreeObserver.OnGlobalLayoutListener gll = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect measureRect = new Rect();
Container.getWindowVisibleDisplayFrame(measureRect);
int keypadHeight = Container.getRootView().getHeight() - measureRect.bottom;
if (keypadHeight > 0) {
// keyboard is opened
} else {
recyclerView.setVisibility(View.VISIBLE);
}
}
};
这里的Container
是布局的根视图。