How do I detect if software keyboard is visible on Android Device or not?

前端 未结 30 1387
情书的邮戳
情书的邮戳 2020-11-22 10:59

Is there a way in Android to detect if the software (a.k.a. \"soft\") keyboard is visible on screen?

30条回答
  •  渐次进展
    2020-11-22 11:28

    There is a direct method to find this out. And, it does not require the layout changes.
    So it works in immersive fullscreen mode, too.
    But, unfortunately, it does not work on all devices. So you have to test it with your device(s).

    The trick is that you try to hide or show the soft keyboard and capture the result of that try.
    If it works correct then the keyboard is not really shown or hidden. We just ask for the state.

    To stay up-to-date, you simply repeat this operation, e.g. every 200 milliseconds, using a Handler.

    The implementation below does just a single check.
    If you do multiple checks, then you should enable all the (_keyboardVisible) tests.

    public interface OnKeyboardShowHide
    {
        void    onShowKeyboard( Object param );
        void    onHideKeyboard( Object param );
    }
    
    private static Handler      _keyboardHandler    = new Handler();
    private boolean             _keyboardVisible    = false;
    private OnKeyboardShowHide  _keyboardCallback;
    private Object              _keyboardCallbackParam;
    
    public void start( OnKeyboardShowHide callback, Object callbackParam )
    {
        _keyboardCallback      = callback;
        _keyboardCallbackParam = callbackParam;
        //
        View view = getCurrentFocus();
        if (view != null)
        {
            InputMethodManager imm = (InputMethodManager) getSystemService( Activity.INPUT_METHOD_SERVICE );
            imm.hideSoftInputFromWindow( view.getWindowToken(), InputMethodManager.HIDE_IMPLICIT_ONLY, _keyboardResultReceiver );
            imm.showSoftInput( view, InputMethodManager.SHOW_IMPLICIT, _keyboardResultReceiver );
        }
        else // if (_keyboardVisible)
        {
            _keyboardVisible = false;
            _keyboardCallback.onHideKeyboard( _keyboardCallbackParam );
        }
    }
    
    private ResultReceiver      _keyboardResultReceiver = new ResultReceiver( _keyboardHandler )
    {
        @Override
        protected void onReceiveResult( int resultCode, Bundle resultData )
        {
            switch (resultCode)
            {
                case InputMethodManager.RESULT_SHOWN :
                case InputMethodManager.RESULT_UNCHANGED_SHOWN :
                    // if (!_keyboardVisible)
                    {
                        _keyboardVisible = true;
                        _keyboardCallback.onShowKeyboard( _keyboardCallbackParam );
                    }
                    break;
                case InputMethodManager.RESULT_HIDDEN :
                case InputMethodManager.RESULT_UNCHANGED_HIDDEN :
                    // if (_keyboardVisible)
                    {
                        _keyboardVisible = false;
                        _keyboardCallback.onHideKeyboard( _keyboardCallbackParam );
                    }
                    break;
            }
        }
    };
    

提交回复
热议问题