Android: как я могу сказать, отображается ли мягкая клавиатура или нет?
Это дилемма:
Я показываю экран с 3 полями ввода и 2 кнопками внутри вкладки (всего 3 вкладки, и они находятся в нижней части экрана). 2 кнопки установлены в левом и правом нижнем углу экрана, прямо над вкладками. когда я нажимаю на поле ввода, вкладки и кнопки нажимаются вверху клавиатуры.
Я хочу только нажимать кнопки вверх и оставлять вкладки там, где они были первоначально, внизу. Я собираюсь установить видимость вкладок в GONE, как только я определю, что отображается мягкая клавиатура, и видимость для VISIBLE после исчезновения мягкой клавиатуры.
есть ли какой-нибудь слушатель для мягкой клавиатуры или, может быть, поле ввода? возможно, какое-то сложное использование OnFocusChangeListener
для текста редактирования? Как определить, видима ли клавиатура или нет?
Ответы
Ответ 1
Невозможно определить, отображается ли клавиатура.
Вы можете отключить его все вместе с тегом windowSoftInputMode
xml в вашем манифесте: http://developer.android.com/reference/android/R.attr.html#windowSoftInputMode. Или вы можете посмотреть, как удалить фокус, чтобы скрыть клавиатуру: Скрыть мягкую клавиатуру от активности без каких-либо операций с клавиатурой.
И точно не решит вашу проблему. Я помню, как читал blogpost, настоятельно советуя не использовать вкладки внизу, а не в верхней части экрана, для причин ясности интерфейса. Я рекомендую вам следить за этим.
Ответ 2
Насколько я знаю, вы не можете.
Тем не менее, вы можете отслеживать изменения размера вашего макета, и поскольку раскрытие клавиатуры является основной причиной изменения размера, вы можете предположить, что клавиатура показана или нет.
Здесь приведен пример кода для мониторинга изменений размера макета. Просто используйте этот макет в качестве родителя исходного макета и используйте его слушатель. Если высота уменьшилась, вы можете предположить, что отображается клавиатура, и если она была увеличена, вы можете предположить, что она закрыта.
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;
}
}
Ответ 3
Это может помочь
http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html
https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/master/java/src/com/android/inputmethod/latin
Код клавиатуры здесь, я немного пробормотал его, но сдаюсь, я не вижу никаких трансляций, которые будут полезны, по крайней мере, здесь. Возможно, вы можете найти код нижнего уровня в репо и найти полезное намерение. Первая ссылка может сказать вам, когда она станет видимой, но я не уверен, как сказать, когда она станет невидимой.
Ответ 4
В моем последнем приложении у меня были некоторые проблемы при отображении мягкой клавиатуры, затем я использовал следующий код в моем файле манифеста:
<activity
android:screenOrientation="portrait"
android:configChanges="keyboardHidden|orientation"
android:name=".rate.Calculator"/>