Есть ли способ узнать, отображается ли мягкая клавиатура?

есть ли способ узнать, отображается ли экранная клавиатура в действии или нет?

Я пробовал

InputMethodManager manager = (InputMethodManager) 
getSystemService(getApplicationContext().INPUT_METHOD_SERVICE);
manager.isActive(v)

но isActive возвращает false только до того, как будет показана первая клавиатура, но если kb появляется и затем отклоняется, isActive также возвращает значение true.

есть ли другой способ проверить эту проблему.

спасибо

Ответ 1

В соответствии с этим POST

Вы не можете определить, отображается ли мягкая клавиатура или нет, но вы можете косвенно знать, что панель мягкой клавиатуры показана, зная, что размер View вашей активности изменяется.

Представьте, что у вас есть ListView, а внизу EditText, вы хотите перейти в нижнюю часть списка, когда отображается мягкая клавиатура после того, как пользователь нажимает на EditText.

Вам нужно реализовать подкласс ListView, а затем использовать его в ListActivity или Activity или 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);
        }
    }
}

Надеюсь, что это поможет

PS. "Check Configuration Changes" работает только для ручной клавиатуры.

Ответ 2

Вы можете определить состояние и координаты программной клавиатуры, используя команду dumpsys shell.

Поскольку dumpsys требует permission.android.DUMP, который является разрешением системного приложения, у вас есть два варианта: 1. используйте укороченное устройство для предоставления этого разрешения. 2. переопределите проблему, используя adb, как описано в моем другом ответе.

Теперь запустите следующую команду: dumpsys window InputMethod | grep "mHasSurface", чтобы получить данные, которые вы ищете.

Ответ 3

Это моя идея. Это не проверено.

@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();
        }
    }

Ответ 4

Проверьте настройки конфигурации для своей деятельности.

Это для вашего AndroidManifest.xml

и это для вашего класса Activity http://developer.android.com/reference/android/app/Activity.html#onConfigurationChanged(android.content.res.Configuration)

Вам нужно будет @Override общедоступный метод onConfigurationChanged (android.content.res.Configuration) вашей Activity, чтобы иметь возможность обрабатывать, например, эти значения:
  hardKeyboardHidden,
  клавиатура,
  keyboardHidden

Для всех возможных значений проверьте http://developer.android.com/reference/android/content/res/Configuration.html

Вы увидите там что-то вроде этого:

HARDKEYBOARDHIDDEN_NO   
HARDKEYBOARDHIDDEN_UNDEFINED    
HARDKEYBOARDHIDDEN_YES  
KEYBOARDHIDDEN_NO   
KEYBOARDHIDDEN_UNDEFINED    
KEYBOARDHIDDEN_YES  
KEYBOARD_12KEY  
KEYBOARD_NOKEYS 
KEYBOARD_QWERTY 
KEYBOARD_UNDEFINED

Также вы сможете прочитать что-то вроде этого:

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:

Вот конкретный пример того, о чем я говорю:

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();
    }
}