Android 弹出软键盘所遇到的坑及解决方法

 更新时间:2017年01月24日 16:21:42   作者:struggle323  
这篇文章主要介绍了Android 弹出软键盘所遇到的坑及解决方法,非常不错,具有参考借鉴价值,需要的朋友参考下

demo下载

重要代码:

//1、此layout作为最外层的layout;
//2、设置需要调整的view: setAdjustView(View view);
//3、如果需要控制输入框的显示与隐藏,可以实现OnInputViewVisibleListener接口;
public class SoftInputAdjustLayout extends RelativeLayout {
  private static final String TAG = SoftInputAdjustLayout.class.getSimpleName();
  private View adjustView;
  public SoftInputAdjustLayout(Context context) {
    this(context, null);
  }
  public SoftInputAdjustLayout(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }
  public SoftInputAdjustLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    this.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
      @Override
      public void onGlobalLayout() {
        try {
          Rect r = new Rect();
          getWindowVisibleDisplayFrame(r);
          int heightDiff = getRootView().getHeight() - (r.bottom - r.top);
          if (heightDiff > 100) {
            if (onInputViewVisibleListener != null) {
              onInputViewVisibleListener.onShowInputView();
            }
          } else {
            if (onInputViewVisibleListener != null) {
              onInputViewVisibleListener.onHideInputView();
            }
          }
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    });
  }
  /**
   * 需要调整的view
   *
   * @param adjustView
   */
  public void setAdjustView(View adjustView) {
    this.adjustView = adjustView;
  }
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (adjustView != null) {
      Rect rect = new Rect();
      getWindowVisibleDisplayFrame(rect);
      int totalHeight = getHeight();
      int nowHeight = rect.bottom - rect.top;
      int keyBoardHeight = totalHeight - nowHeight;
      if (keyBoardHeight > totalHeight / 4) {
        super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(totalHeight, MeasureSpec.EXACTLY));
        LayoutParams params = (LayoutParams) adjustView.getLayoutParams();
        params.bottomMargin = keyBoardHeight;
      } else {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        LayoutParams params = (LayoutParams) adjustView.getLayoutParams();
        params.bottomMargin = 0;
      }
    } else {
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
  }
  private OnInputViewVisibleListener onInputViewVisibleListener;
  public void setOnInputViewVisibleListener(OnInputViewVisibleListener listener) {
    onInputViewVisibleListener = listener;
  }
  public interface OnInputViewVisibleListener {
    void onShowInputView();
    void onHideInputView();
  }
}

备注:

全屏模式:

1、通过style或者setFlags(…)来设置全屏;

2、AndroidManifest.xml中activity设置:android:windowSoftInputMode=”adjustResize”;

3、此layout必须作为布局的最外层layout;

4、一定要在布局中添加一个view,如下:

 <!--此view用于获取焦点,当软件盘弹出时,根据此view来弹出,而此view在最顶部,且大小为0,所以软件盘弹出,不会把背景顶上去-->
  <View
    android:layout_width="0px"
    android:layout_height="0px"
    android:focusable="true" 
android:focusableInTouchMode="true" />

5、通过setAdjustView(View view)来设置需要调整的view;

6、在全屏模式下,输入框开始是未显示的,直到弹出软键盘,才会显示输入框。因为如果输入框一开始就显示,那软键盘就会根据输入框来弹出,且输入框在底部,那就可能造成把整个view顶上去。所以这时我们应该实现OnInputViewVisibleListener这个接口来控制输入框的显示与隐藏。

非全屏模式

1、AndroidManifest.xml中activity设置:android:windowSoftInputMode=”adjustResize”;

2、此layout必须作为布局的最外层layout;

3、通过setAdjustView(View view)来设置需要调整的view;

4、如果需要控制输入框的显示与隐藏,就实现OnInputViewVisibleListener这个接口。

以上所述是小编给大家介绍的Android 弹出软键盘所遇到的坑及解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Android App的运行环境及Android系统架构概览

    Android App的运行环境及Android系统架构概览

    这篇文章主要介绍了Android App的运行环境及Android系统架构概览,并对应用程序进程间隔离机制等知识点作了介绍,需要的朋友可以参考下
    2016-03-03
  • Android开发中Dialog半透明背景消失

    Android开发中Dialog半透明背景消失

    这篇文章主要介绍了Android开发中Dialog半透明背景消失的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • Android实现圆形菜单悬浮窗

    Android实现圆形菜单悬浮窗

    这篇文章主要为大家详细介绍了Android实现圆形菜单悬浮窗,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Android实现屏幕手写签名

    Android实现屏幕手写签名

    这篇文章主要为大家详细介绍了Android实现屏幕手写签名,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Android HorizontalScrollView内子控件横向拖拽实例代码

    Android HorizontalScrollView内子控件横向拖拽实例代码

    本文主要介绍Android HorizontalScrollView的使用,这里给大家一个实例来展示HorizontalScrollView内子控件横向拖拽的效果实现,有需要的小伙伴可以参考下
    2016-07-07
  • Android XUtils3框架的基本使用方法(二)

    Android XUtils3框架的基本使用方法(二)

    这篇文章主要介绍了Android XUtils3框架的基本使用方法(二)的相关资料,需要的朋友可以参考下
    2016-08-08
  • Android教你如何发现APP卡顿的实现

    Android教你如何发现APP卡顿的实现

    这篇文章主要介绍了Android教你如何发现APP卡顿的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Android服务Service教程

    Android服务Service教程

    Android的服务是开发Android应用程序的重要组成部分。不同于活动Activity,服务是在后台运行,服务没有接口,生命周期也与活动Activity非常不同。通过使用服务我们可以实现一些后台操作,比如想从远程服务器加载一个网页等,下面来看看详细内容,需要的朋友可以参考下
    2021-11-11
  • Android实现带指示点的自动轮播无限循环效果

    Android实现带指示点的自动轮播无限循环效果

    这篇文章主要为大家详细介绍了Android实现带指示点的自动轮播无限循环效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • android自定义进度条移动效果

    android自定义进度条移动效果

    这篇文章主要为大家详细介绍了android自定义进度条移动效果,进度数字随进度移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05

最新评论