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

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

Я старался

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

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

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

Спасибо

4 ответа

Решение

Согласно этому посту

Вы не можете определить, отображается ли программная клавиатура или нет, но вы можете косвенно узнать, отображается ли программная клавиатура, зная, что 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. "Проверить изменения конфигурации" работает только для ручной клавиатуры.

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

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

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

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

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

Пожалуйста, проверьте изменения конфигурации для вашей активности

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

и это для вашего класса деятельности http://developer.android.com/reference/android/app/Activity.html)

Вам нужно будет @Override открытый метод onConfigurationChanged(android.content.res.Configuration) вашей Деятельности, чтобы иметь возможность обрабатывать, например, следующие значения:
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.

ОБНОВИТЬ:

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

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();
    }
}
Другие вопросы по тегам