alertDialog.getWindow()clearFlags(WidnowManager.LayoutParams.FLAG_ALIFOCUSABLE_IM);另外,为了防止弹出输入法时把后面的背景挤变形,可在Mainfest里添加:
android:windowSoftInputMode="adjustPan|stateHidden"adjustPan:键盘会覆盖屏幕。stateVisible|adjustResize:屏幕整体上移。
a.此属性有两个作用:1)当Activity获得焦点时,软键盘的状态是隐藏还是显示;2)Activity窗口调整--是否减少活动主窗口大小以便腾出空间放软键盘,或是否当活动窗口的部分被软键盘覆盖时它的内容的当前焦点是可见的。
b.取值范围:必须是下表中的一个值,或一个“stage……”加一个“adjust……”值的组合,用“|”分开。在这设置的值(除stateUnspecified和adjustUnspecified外)将覆盖在主题中设置的值。
值 |
描述 |
"stateUnspecified" |
软键盘的状态 (是否它是隐藏或可见 )没有被指定。系统将选择一个合适的状态或依赖于主题的设置。 这个是为了软件盘行为默认的设置。 |
"stateUnchanged" |
软键盘被保持无论它上次是什么状态,是否可见或隐藏,当主窗口出现在前面时。 |
"stateHidden" |
当用户选择该 Activity时,软键盘被隐藏——也就是,当用户确定导航到该 Activity时,而不是返回到它由于离开另一个 Activity。 |
"stateAlwaysHidden" |
软键盘总是被隐藏的,当该 Activity主窗口获取焦点时。 |
"stateVisible" |
软键盘是可见的,当那个是正常合适的时 (当用户导航到 Activity主窗口时 )。 |
"stateAlwaysVisible" |
当用户选择这个 Activity时,软键盘是可见的——也就是,也就是,当用户确定导航到该 Activity时,而不是返回到它由于离开另一个Activity。 |
"adjustUnspecified" |
它不被指定是否该 Activity主 窗口调整大小以便留出软键盘的空间,或是否窗口上的内容得到屏幕上当前的焦点是可见的。系统将自动选择这些模式中一种主要依赖于是否窗口的内容有任何布局 视图能够滚动他们的内容。如果有这样的一个视图,这个窗口将调整大小,这样的假设可以使滚动窗口的内容在一个较小的区域中可见的。这个是主窗口默认的行为 设置。 |
"adjustResize" |
该 Activity主窗口总是被调整屏幕的大小以便留出软键盘的空间 |
"adjustPan" |
该 Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。 |
转自:http://www.cnblogs.com/coding-way/archive/2012/07/10/2585511.html
原理:利用事件分发机制,当点击的是EditText控件之外的地方就隐藏键盘。
知识补充:getCurrentFocus():获得当前焦点的view,一般情况下都是EditText(特殊情况就是轨迹球或实体按键会移动焦点,而现在机型基本都没有这些按键了,所以此方法如果有值,那么肯定是EditText。更明确地说:只有EditText能获取焦点~)
@Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { // 获得当前得到焦点的View,一般情况下就是EditText(特殊情况就是轨迹求或者实体案件会移动焦点) View v = getCurrentFocus(); if (isShouldHideInput(v, ev)) { hideSoftInput(v.getWindowToken()); } } return super.dispatchTouchEvent(ev); } /** * 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘,因为当用户点击EditText时没必要隐藏 * * @param v * @param event * @return */ private boolean isShouldHideInput(View v, MotionEvent event) { if (v != null && (v instanceof EditText)) { System.out.println("2----"+v.getClass()); int[] l = { 0, 0 }; v.getLocationInWindow(l); int left = l[0], top = l[1], bottom = top + v.getHeight(), right = left + v.getWidth(); if (event.getRawX() > left && event.getRawX() < right && event.getRawY() > top && event.getRawY() < bottom) { // 点击EditText的事件,忽略它。 return false; } else { return true; } } // 如果焦点不是EditText则忽略,这个发生在视图刚绘制完,第一个焦点不在EditView上,和用户用轨迹球选择其他的焦点 return false; } /** * 多种隐藏软件盘方法的其中一种 * * @param token */ private void hideSoftInput(IBinder token) { if (token != null) { InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS); } }
另一种实现方式:给某些控件设置焦点,然后设置EditText失去焦点时隐藏键盘。
当然,上面说了默认情况只有EditText能获取焦点,要想让其他控件获取焦点,需设置:
android:focusable="true" android:focusableInTouchMode="true"当设置这俩属性后,导致的结果是马丹,看图: