Есть ли в Android способ определить, видна ли программная («мягкая») клавиатура на экране?
android
keyboard
android-softkeyboard
Andreea
источник
источник
Ответы:
Там нет прямого пути - см http://groups.google.com/group/android-platform/browse_thread/thread/1728f26f2334c060/5e4910f0d9eb898a где Дайан Hackborn из команды Android ответил. Однако вы можете обнаружить это косвенно, проверив, изменился ли размер окна в #onMeasure. См. Как проверить видимость программной клавиатуры в Android? ,
источник
Это работает для меня. Может быть, это всегда лучший способ для всех версий .
Было бы эффективно создать свойство видимости клавиатуры и наблюдать, как эти изменения задерживаются, поскольку метод onGlobalLayout вызывается много раз. Также хорошо проверить вращение устройства и
windowSoftInputMode
нетadjustNothing
.источник
contentView
заявлено?попробуй это:
источник
Я создал простой класс, который можно использовать для этого: https://github.com/ravindu1024/android-keyboardlistener . Просто скопируйте его в свой проект и используйте следующим образом:
источник
Очень просто
1. Поместите идентификатор на ваш корневой вид
rootView
это просто представление, указывающее на мой корневой вид в этом случаеrelative layout
:2. Инициализируйте свое корневое представление в своей деятельности:
RelativeLayout rootView = (RelativeLayout) findViewById(R.id.addresses_confirm_root_view);
3. Определите, открыта или закрыта клавиатура с помощью
getViewTreeObserver()
источник
1
. Не важно. Только это должно быть меньше реальной длины клавиатурыЯ использовал это в качестве основы: http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android
Затем написал этот метод:
Затем вы можете использовать это для проверки всех полей (EditText, AutoCompleteTextView и т. Д.), Которые могли открыть программную клавиатуру:
К сожалению, это не идеальное решение, но оно выполняет свою работу.
источник
Вы можете использовать результат обратного вызова showSoftInput () и hideSoftInput (), чтобы проверить состояние клавиатуры. Полная информация и пример кода на
http://www.ninthavenue.com.au/how-to-check-if-the-software-keyboard-is-shown-in-android
источник
Вы можете обратиться к этому ответу - https://stackoverflow.com/a/24105062/3629912
Это работало на меня каждый раз.
Он вернет true, если видна программная клавиатура.
источник
Так что после долгого времени игры с AccessibilityServices, оконными вставками, определением высоты экрана и т. Д., Я думаю, я нашел способ сделать это.
Отказ от ответственности: он использует скрытый метод в Android, что означает, что он может быть непоследовательным. Тем не менее, в моем тестировании, похоже, работает.
Метод является InputMethodManager # getInputMethodWindowVisibleHeight () и существует с Lollipop (5.0).
Вызов, который возвращает высоту в пикселях текущей клавиатуры. Теоретически клавиатура не должна быть 0 пикселей в высоту, поэтому я сделал простую проверку высоты (в Kotlin):
Я использую Android Hidden API, чтобы избежать рефлексии, когда я вызываю скрытые методы (я делаю это много для приложений, которые я разрабатываю, в основном это хакерские / настраивающие приложения), но это должно быть возможно и с помощью рефлексии:
источник
Это было намного менее сложным для требований, в которых я нуждался. Надеюсь, что это может помочь:
На основной деятельности:
Основное логическое значение по умолчанию для mKeyboardStatus будет инициализировано как false .
Затем проверьте значение следующим образом и при необходимости выполните действие:
источник
Это должно работать, если вам нужно проверить состояние клавиатуры:
Где
UiUtils.KEYBOARD_VISIBLE_THRESHOLD_DP
= 100, а dip () - это функция anko, которая преобразует dpToPx:источник
Я сделал это, установив GlobalLayoutListener, следующим образом:
источник
Попробуйте этот код, он действительно работает, если KeyboardShown показан, то эта функция возвращает истинное значение ....
источник
В моем случае у меня был только один
EditText
способ управления макетом, поэтому я нашел это решение. Это работает хорошо, в основном это обычай,EditText
который слушает фокус и отправляет локальную трансляцию, если фокус меняется или если нажата кнопка назад / сделано. Чтобы работать, вам нужно поместить манекенView
в макет с помощьюandroid:focusable="true"
иandroid:focusableInTouchMode="true"
потому, что при вызовеclearFocus()
фокус будет переназначен на первый фокусируемый вид. Пример фиктивного представления:Дополнительная информация
Решение, которое обнаруживает разницу в изменениях компоновки, работает не очень хорошо, потому что оно сильно зависит от плотности экрана, поскольку 100 пикселей может быть много на одном устройстве, а на некоторых других вы не получите ложных срабатываний. Также разные производители имеют разные клавиатуры.
источник
В Android вы можете обнаружить через оболочку ADB. Я написал и использую этот метод:
источник
источник
Ответ @iWantScala отличный, но не работает для меня
rootView.getRootView().getHeight()
всегда имеет одинаковое значениеОдним из способов является определение двух переменных
добавить глобального слушателя
затем проверьте
работает отлично
источник
Наконец-то появился прямой путь от Android R на базе Kotlin.
источник
У меня была похожая проблема. Мне нужно было отреагировать на кнопку Enter на экране (которая спрятала клавиатуру). В этом случае вы можете подписаться на OnEditorAction текстового представления, с которым была открыта клавиатура - если у вас есть несколько редактируемых блоков, то подпишитесь на все из них.
В своей деятельности вы полностью контролируете клавиатуру, поэтому ни при каких условиях вы не столкнетесь с проблемой, открыта ли клавиатура или нет, если вы слушаете все события открытия и закрытия.
источник
Существует прямой способ выяснить это. И это не требует изменения макета.
Так что он работает и в полноэкранном режиме с погружением.
Но, к сожалению, это работает не на всех устройствах. Таким образом, вы должны проверить это с вашим устройством (ами).
Хитрость в том, что вы пытаетесь скрыть или показать программную клавиатуру и зафиксировать результат этой попытки.
Если все работает правильно, клавиатура не отображается и не скрывается. Мы просто просим о состоянии.
Чтобы оставаться в курсе, вы просто повторяете эту операцию, например, каждые 200 миллисекунд, используя обработчик.
Реализация ниже делает только одну проверку.
Если вы делаете несколько проверок, вам следует включить все (_keyboardVisible) тесты.
источник
Вот обходной путь, чтобы узнать, видна ли программная клавиша.
У некоторых популярных клавиатур есть определенные ключевые слова в их classNames:
Из ActivityManager.RunningServiceInfo проверьте наличие вышеуказанных шаблонов в ClassNames. Кроме того, ActivityManager.RunningServiceInfo's clientPackage = android указывает, что клавиатура привязана к системе.
Вышеупомянутая информация может быть объединена для строгого способа выяснить, видна ли программная клавиатура.
источник
Как вы, наверное, знаете, Клавиатура Android Software будет видна только при возможном событии набора текста. Другими словами, клавиатура становится видимой только тогда, когда EditText сфокусирован. это означает, что вы можете узнать, видна клавиатура или нет, с помощью OnFocusChangeListener .
Теперь вы можете использовать переменную isKeyBoardVisible в любом месте класса, чтобы узнать, открыта ли клавиатура или нет. Это хорошо сработало для меня.
Примечание. Этот процесс не работает, когда клавиатура открывается программно с помощью InputMethodManager, потому что это не вызывает OnFocusChangeListener.
источник
Я преобразовал ответ в kotlin, надеюсь, это поможет пользователям kotlin.
источник
Он работает с настройкой AdjustNothing, и используются события жизненного цикла. Также с Kotlin:
Полезный способ держать вид всегда над клавиатурой
Где getFullViewBounds
Где getFullScreenSize
Где updateMargin
источник
Я сделал это следующим образом, но это можно сделать только в том случае, если ваша цель - закрыть / открыть клавиатуру.
пример закрытия: (проверка, закрыта ли клавиатура, если нет - закрытие)
источник
может использовать:
источник
Я написал образец .
Этот репозиторий может помочь определить состояние клавиатуры, не предполагая, что «клавиатура должна быть больше, чем X часть экрана»
источник
Если вы поддерживаете apis для AndroidR в своем приложении, вы можете использовать метод ниже.
Примечание: это доступно только для AndroidR, и ниже версия Android должна следовать некоторым другим ответам, или я обновлю это для этого.
источник