安卓如何检测软键盘关闭

7
我已经花费了几个小时来解决这个问题,但我找不到一种方法来确定键盘是否显示。

我看到了很多关于这个问题的问题和答案,这取决于容器布局的高度变化。因此,当(例如)Edittext获取焦点并且结果是完整高度布局和其视图的更改时,不能精确地检测键盘的打开。

解决方案1: 我通过从所有EditText中删除焦点并在Edittext获得焦点时更改我不需要它们显示的视图的可见性(提供可用空间以防止视图混乱),因此我有足够的时间删除冗余视图。

但是,不可能检测到何时要求关闭键盘以使视图可见。

如果我使用第2段中提到的常见方法来检测键盘关闭,它将失败我的“解决方案1”。

我现在唯一的想法是通过监视负责键盘关闭的按键来检测键盘关闭,但我无法在onKeyDown方法中检测它。

enter image description here

那么我该如何监控这个关键点呢?

任何指南和想法都将不胜感激。提前致谢。

最终解决方案:
感谢@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是布局的根视图。

1个回答

14

做这件事没有简单可靠的方法(荒谬吧)。但是可以分两部分实现,如这里所建议的使用布局监听器。虽然有点小技巧,但它有效。

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,因为它看起来很有趣和有前途,但它可能无法与在非全屏幕上运行的应用程序一起使用...有点像黑客,但不是那么通用。 - snachmsm
可以通过在知道键盘状态隐藏时缓存屏幕高度来解决这个问题,但如果用户稍后使用分屏模式仍然会出现问题。 - Nick Cardoso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接