一、android 软键盘弹出隐藏挤压界面等问题

1、横屏时,点击输入框出现全键盘解决方案: 在EditText、searchview等控件中加

android:imeOptions="flagNoExtractUi"

2、竖屏时,安卓会出现半屏。 
case1:你的输入框处于中下的位置,这样的话,键盘可能挡住输入框。 解决方法:在manifest中对activity设置

android:windowSoftInputMode="adjustResize"

这样activity的主窗口总会resize为键盘提供空间

case2:你的输入框处于偏上面,一般情况下这样就不会有什么问题,但是如果你的界面纵向方面使用的是layout_weight即比重来分布页面的话,软件盘会压缩整个window,导致输入框部分被压缩。 解决方法:在manifest中对activity设置

android:windowSoftInputMode="adjustPan"

这样键盘不会对压缩原窗口,只会遮盖下面一部分内容。这样输入框不会被压缩了。

3、刚进入一个activity,会focus 输入框,这时会主动弹出软键盘,如果不希望自动弹出,那么可先让其他的不重要的控件获取焦点

android:focusableInTouchMode="true"

4、判断软键盘当前是否处于弹出状态

if(getWindow().getAttributes().softInputMode==WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)

5、手动隐藏软键盘

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

6、手动弹出软键盘

((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);

6、触摸任意非EditText位置关闭软键盘

@Override
 public boolean dispatchTouchEvent(MotionEvent ev) {
 if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
  if (isShouldHideKeyboard(v, ev)) {
 hideKeyboard(v.getWindowToken());
}
}
 }

 /**
      * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时则不能隐藏
      *
      * @param v
      * @param event
      * @return
      */
     private boolean isShouldHideKeyboard(View v, MotionEvent event) {
         if (v != null && (v instanceof EditText)) {
             int[] l = {0, 0};
             v.getLocationInWindow(l);
             int left = l[0],
                 top = l[1],
                 bottom = top + v.getHeight(),
                 right = left + v.getWidth();
             if (event.getX() > left && event.getX() < right
                     && event.getY() > top && event.getY() < bottom) {
                 // 点击EditText的事件,忽略它。
                 return false;
             } else {
                 return true;
             }
         }
         // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditText上,和用户用轨迹球选择其他的焦点
         return false;
     }
/**
      * 获取InputMethodManager,隐藏软键盘
      * @param token
      */
     private void hideKeyboard(IBinder token) {
         if (token != null) {
             InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
             im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
         }
     }