Is there a way to tell if the soft-keyboard is shown?

后端 未结 4 403
被撕碎了的回忆
被撕碎了的回忆 2020-11-27 19:48

is there a way to tell if the softkeyboard is shown in an activity or not?

I tried

InputMethodManager manager = (InputMethodManager) 
getSystemServi         


        
相关标签:
4条回答
  • 2020-11-27 20:06

    This is my idea. It is untested.

    @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);   
    
            // Checks whether a keyboard is available which is not hard keyboard
            if ((newConfig.keyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO)&&(newConfig.keyboardHidden != Configuration.KEYBOARDHIDDEN_NO)) {
                Toast.makeText(this, "soft keyboard visible", Toast.LENGTH_SHORT).show();
            } else if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_YES) {
            Toast.makeText(this, "soft keyboard hidden", Toast.LENGTH_SHORT).show();
            }
        }
    
    0 讨论(0)
  • 2020-11-27 20:21

    Please check Configuration Changes for your Activity

    This for your AndroidManifest.xml

    and this for your Activity class http://developer.android.com/reference/android/app/Activity.html#onConfigurationChanged(android.content.res.Configuration)

    You will need to @Override the public method onConfigurationChanged(android.content.res.Configuration) of your Activity to be able to handle, for example, these values:
    hardKeyboardHidden,
    keyboard,
    keyboardHidden

    For all possible values check http://developer.android.com/reference/android/content/res/Configuration.html

    You will see there something like this:

    HARDKEYBOARDHIDDEN_NO   
    HARDKEYBOARDHIDDEN_UNDEFINED    
    HARDKEYBOARDHIDDEN_YES  
    KEYBOARDHIDDEN_NO   
    KEYBOARDHIDDEN_UNDEFINED    
    KEYBOARDHIDDEN_YES  
    KEYBOARD_12KEY  
    KEYBOARD_NOKEYS 
    KEYBOARD_QWERTY 
    KEYBOARD_UNDEFINED
    

    Also there you will be able to read something like this:

    public int  hardKeyboardHidden // A flag indicating whether the hard keyboard 
                                   // has been hidden.
    public int  keyboard    The kind of keyboard attached to the device.
    public int  keyboardHidden  A flag indicating whether any keyboard is available.
    

    UPDATE:

    Here is a specific example of what I´m talking about:

    http://developer.android.com/guide/topics/resources/runtime-changes.html

        
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    
        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        }
        // Checks whether a hardware keyboard is available
        if (newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO) {
            Toast.makeText(this, "keyboard visible", Toast.LENGTH_SHORT).show();
        } else if (newConfig.hardKeyboardHidden == 
              Configuration.HARDKEYBOARDHIDDEN_YES) {
            Toast.makeText(this, "keyboard hidden", Toast.LENGTH_SHORT).show();
        }
    }
    
    0 讨论(0)
  • 2020-11-27 20:23

    According to this POST

    You cannot detect if soft keyboard is shown or not, but you can indirectly know that a soft key board is shown by knowing that the View of your activity is resized.

    Imagine you have a ListView and at the bottom an EditText, you want to go to the bottom of the list when a soft keyboard is shown after user clicks the EditText.

    You need to implement a subclass of ListView, then use it in your ListActivity or Activity or View.

    public class ThreadView extends ListView {
    
        public ThreadView(Context context, AttributeSet attributeSet) {
            super(context, attributeSet);
        }
    
        @Override
        protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) {
            super.onSizeChanged(xNew, yNew, xOld, yOld);
    
            if (yOld > yNew) {
                setSelection(((ListAdapter) getAdapter()).getCount() - 1);
            }
        }
    }
    

    Hope this helps

    PS. "check Configuration Changes" only works for hand keyboard.

    0 讨论(0)
  • 2020-11-27 20:28

    You can detect the state AND coordinates of the software keyboard, using dumpsys shell command.

    Because dumpsys requires permission.android.DUMP, which is a system application permission, you have two options: 1. use a rooted device to grant this permission. 2. override the problem using adb as described in my other answer.

    Now, run the following command: dumpsys window InputMethod | grep "mHasSurface" to get the data you are looking for.

    0 讨论(0)
提交回复
热议问题