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"/>