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

Это дилемма: я показываю экран с 3 полями ввода и 2 кнопками внутри вкладки (всего 3 вкладки, и они находятся в нижней части экрана). 2 кнопки установлены в левом и правом нижнем углу экрана, прямо над вкладками. Когда я нажимаю на поле ввода, вкладки и кнопки все нажимаются вверху клавиатуры.

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

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

Solutions Collecting From Web of "Android: как я могу сказать, отображается ли мягкая клавиатура или нет?"

Определить, отображается ли клавиатура, по-видимому, невозможно.

Возможно, вы захотите отключить его все вместе с windowSoftInputMode в вашем манифесте: http://developer.android.com/reference/android/R.attr.html#windowSoftInputMode . Или вы можете посмотреть, как удалить фокус, чтобы скрыть клавиатуру: Скрыть мягкую клавиатуру от активности без каких-либо операций с клавиатурой .

И точно не решит вашу проблему. Я помню, как читал blogpost, настоятельно советуя не использовать вкладки внизу, а не в верхней части экрана, для ясности интерфейса. Я рекомендую вам следить за этим.

Насколько я знаю, вы не можете.

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

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

 public class LayoutSizeChangedSensorFrameLayout extends FrameLayout { public enum SizeChange { HEIGHT_INCREASED, HEIGHT_DECREASED, WIDTH_INCREASED, WIDTH_DECREASED } public interface OnLayoutSizeChangedListener { void onSizeChanged(EnumSet<SizeChange> direction); } private OnLayoutSizeChangedListener mLayoutSizeChangeListener; public LayoutSizeChangedSensorFrameLayout(final Context context) { super(context); } public LayoutSizeChangedSensorFrameLayout(final Context context, final AttributeSet attributeSet) { super(context, attributeSet); } public LayoutSizeChangedSensorFrameLayout(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); } @Override protected void onSizeChanged(final int w, final int h, final int oldw, final int oldh) { super.onSizeChanged(w, h, oldw, oldh); if (mLayoutSizeChangeListener != null) { final EnumSet<SizeChange> result = EnumSet.noneOf(SizeChange.class); if (oldh > h) result.add(SizeChange.HEIGHT_DECREASED); else if (oldh < h) result.add(SizeChange.HEIGHT_INCREASED); if (oldw > w) result.add(SizeChange.WIDTH_DECREASED); else if (oldw < w) result.add(SizeChange.WIDTH_INCREASED); if (!result.isEmpty()) mLayoutSizeChangeListener.onSizeChanged(result); } } public void setOnLayoutSizeChangedListener(final OnLayoutSizeChangedListener layoutSizeChangeListener) { this.mLayoutSizeChangeListener = layoutSizeChangeListener; } public OnLayoutSizeChangedListener getOnLayoutSizeChangeListener() { return mLayoutSizeChangeListener; } } 

Это может помочь http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html

https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/master/java/src/com/android/inputmethod/latin

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

В моем последнем приложении у меня были некоторые проблемы при отображении мягкой клавиатуры, а затем я использовал следующий код в моем файле манифеста:

<activity android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation" android:name=".rate.Calculator"/>