Android:如何判断软键盘是否显示?

时间:2010-08-25 18:08:03

标签: android

继承困境: 我正在显示一个屏幕,其中包含3个输入字段和2个按钮(总共有3个标签,它们位于屏幕的底部)。 2个按钮设置在屏幕的左下方和右下方,位于选项卡的正上方。当我点击输入字段时,标签和按钮都被推到键盘顶部。

我希望只按下按钮,并将标签保留在原来的位置,在底部。我想在确定软键盘显示后将标签的可见性设置为GONE,并在软键盘消失后显示可见性。

是否有某种类型的软键盘监听器,或者输入字段?可能是OnFocusChangeListener对编辑文本有些棘手的使用?如何确定键盘是否可见?

5 个答案:

答案 0 :(得分:5)

确定键盘是否显示是不可能的。

您可能希望使用清单中的windowSoftInputMode xml标记将其全部禁用:http://developer.android.com/reference/android/R.attr.html#windowSoftInputMode。或者,您可以查看如何移除焦点以隐藏键盘:Hide soft keyboard on activity without any keyboard operations

两者都不能完全解决您的问题。我记得读过一篇博文章强烈建议不要在屏幕顶部使用标签,而不是屏幕顶部,因为UI清晰度原因。我建议你跟进。

答案 1 :(得分:1)

据我所知,你不能。

但是,您可以监视布局的大小更改,并且由于键盘显示是调整大小的主要原因,您可能会认为键盘是否显示。

这是用于监控布局大小更改的示例代码。只需将此布局用作原始布局的父级,并使用其侦听器。如果高度降低,您可以假设显示键盘,如果它增加了,您可以假设它已关闭。

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;
    }
}

答案 2 :(得分:0)

这可能会有所帮助 http://developer.android.com/reference/android/inputmethodservice/InputMethodService.html

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

键盘代码在这里,我稍微瞥了一眼但放弃了,我没有看到任何有用的广播,至少在这里。也许你可以在回购中找到较低级别的代码并找到一个有用的Intent发送。第一个linke可能会告诉你何时它变得可见,但我不知道如何判断它何时变得不可见。

答案 3 :(得分:0)

对我有用的解决方案-

ViewTreeObserver treeObserver = getViewTreeObserver();
        if (treeObserver != null)
            treeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    int pHeight = getResources().getDisplayMetrics().heightPixels;

                Rect visRect = new Rect();
                viewGroup.getWindowVisibleDisplayFrame(visRect);

                boolean keyboardVisible;
                int keyboardHeight= pHeight-currentHeight;
                if (keyboardHeight > (MIN_KEYBOARD_HEIGHT*pHeight))
                {
                    TGVLog.d(debugTag, "keyboardVisible-- "+true);
                    keyboardVisible = true;
                }
                else
                {
                    TGVLog.d(debugTag, "keyboardVisible-- "+false);
                    keyboardVisible = false;
                }
                }
            });

答案 4 :(得分:-4)

在我的上一个应用程序中,我在显示软键盘方面遇到了一些问题,然后我在我的清单文件中使用了以下代码:

  

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