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