Android检测软键盘关闭

时间:2017-03-19 21:20:34

标签: android keyboard

我正在努力解决这个问题几个小时,我无法找到确定键盘是否显示的方法。

我已经看到了关于这个问题的多个问题和答案,这取决于容器布局的高度变化。因此,当(例如)Edittext获得焦点时,无法准确检测到键盘的打开,因此,更改全高布局及其视图是不可避免的。

解决方案1: 我通过从所有 EditText 中删除焦点来解决这个问题,并在Edittext聚焦时更改我不需要它们的视图的可见性(提供可用空间以防止视图混乱)所以我有足够的时间删除多余的视图。

但是无法检测何时要求关闭键盘以使视图可见。

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

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

enter image description here

那么如何监控此密钥呢?

任何指导和想法将不胜感激。 提前谢谢。

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

2 个答案:

答案 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)应该开火(想想......)