Android 监听软键盘显示和隐藏

1. 监听软键盘

由于官方没有提供相关的监听,只能通过界面布局来判断软键盘显示和隐藏。

  • 通过OnLayoutChangeListener来监听

      getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
              @Override
              public void onLayoutChange(View v, int left, int top, int right, int bottom,
                      int oldLeft, int oldTop, int oldRight, int oldBottom) {
    
              }
          });
    
  • 通过OnGlobalLayoutListener来监听

      getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(
          new ViewTreeObserver.OnGlobalLayoutListener() {
              @Override
              public void onGlobalLayout() {
    
              }
          });
    
  • 判断软键盘显示和隐藏。

      private boolean isShowing() {
          // 获取当前屏幕内容的高度
          int screenHeight = getWindow().getDecorView().getHeight();
    
          // 获取View可见区域的bottom
          Rect rect = new Rect();
          getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
    
          return screenHeight > rect.bottom;
      }
    

    不过在某些导航栏存在的手机上会发生某些问题,可以通过获取导航栏高度来避免。

      private int getNavigatorBarHeight() {
          int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android");
          int height = getResources().getDimensionPixelSize(resourceId);
    
          LogTool.logi("SoftManagerListenerActivity", "Status Bar Height = " + height);
    
          return height;
      }
    

2. 软键盘显示

软键盘显示时可能会覆盖某些控件,必要时需要移动界面。

private void onLayout() {
    //获取当前屏幕内容的高度
    int screenHeight = getWindow().getDecorView().getHeight();

    //获取View可见区域的bottom
    Rect rect = new Rect();
    getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);

    if (screenHeight - getNavigatorBarHeight() > rect.bottom) {
        // mTranslate用来记录是否已经移动
        if (!mTranslate) {
            // 获取按钮的左上角,按钮高度为40dp
            int[] location = new int[2];
            mBtnNext.getLocationOnScreen(location);

            int bottom = location[1] + getResources().getDimensionPixelSize(R.dimen.margin_dpi_50);
            // 如果按钮被覆盖,移动整个界面向上移动
            if (bottom > rect.bottom) {
                getWindow().getDecorView().scrollBy(0, bottom - rect.bottom);
                mTranslate = true;
            }
        }
    } else {
        getWindow().getDecorView().scrollTo(0, 0);
        mTranslate = false;
    }
}

效果如下
Android 监听软键盘显示和隐藏_第1张图片

参考资料:https://www.cnblogs.com/shelly-li/p/5639833.html
参考资料:http://blog.csdn.net/sinat_31311947/article/details/53914000

相关文章
Android TextView控件
Android Span应用
Android EditText控件
Android 监听软键盘显示和隐藏

你可能感兴趣的:(Android,应用)