Есть ли способ узнать, отображается ли софт-клавиатура?
Есть ли способ узнать, отображается ли программная клавиша в действии или нет?
Я старался
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();
}
}