我正在努力解决这个问题几个小时,我无法找到确定键盘是否显示的方法。
我已经看到了关于这个问题的多个问题和答案,这取决于容器布局的高度变化。因此,当(例如)Edittext获得焦点时,无法准确检测到键盘的打开,因此,更改全高布局及其视图是不可避免的。
解决方案1: 我通过从所有 EditText 中删除焦点来解决这个问题,并在Edittext聚焦时更改我不需要它们的视图的可见性(提供可用空间以防止视图混乱)所以我有足够的时间删除多余的视图。
但是无法检测何时要求关闭键盘以使视图可见。
如果我使用我在第2段中提到的常用方法来检测键盘的关闭,它将无法解决我的“解决方案1”。
我现在唯一的想法是通过监视键盘关闭来检测键盘关闭。我无法在onKeyDown方法中检测到它。那么如何监控此密钥呢?
任何指导和想法将不胜感激。 提前谢谢。
最终解决方案:
感谢@Nick Cardoso,我的最终解决方案是使用onTouchListener
检测键盘开放性和Nick的关闭解决方案的组合。
这是针对Edittexts的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
是布局的根视图。
答案 0 :(得分:11)
(荒谬地)没有简单,可靠的方法来做到这一点。然而,它可以分两部分实现,具有建议的here布局监听器。它有点像黑客但它有效:
mRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect measureRect = new Rect(); //you should cache this, onGlobalLayout can get called often
mRootView.getWindowVisibleDisplayFrame(measureRect);
// measureRect.bottom is the position above soft keypad
int keypadHeight = mRootView.getRootView().getHeight() - measureRect.bottom;
if (keypadHeight > 0) {
// keyboard is opened
mIsKeyboardVisible = true;
mMyDependentView.setVisibility(View.GONE);
} else {
//store keyboard state to use in onBackPress if you need to
mIsKeyboardVisible = false;
mMyDependentView.setVisibility(View.VISIBLE);
}
}
});
答案 1 :(得分:0)
它有点猜测,但您可以尝试onBackPressed
覆盖一些OnEditorActionListener
操作:
yourEditText.setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId,
KeyEvent event) {
// or other action, which you are using
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
runSearch();
return true;
}
return false;
}
});
然后onBackPressed
(也可能是onKeyDown
)应该开火(想想......)