15

我有一个应用程序,需要在执行大量操作时关闭软键盘。例如,单击按钮时,绘制新布局时,屏幕方向更改时,控制器告诉UI 时等等。我使用 optionsMenuButton 通过 ViewFlipper 翻转视图,显然我希望键盘隐藏在翻转视图中(那里没有输入字段)。

到目前为止,我已经尝试过这些,并说明为什么这些不可靠:

这个没用,因为我有很多编辑文本和其他视图。如果可能的话,我需要一个更通用的,一个不需要视图作为参数的。

InputMethodManager imm = (InputMethodManager)getSystemService(
  Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

这个对我根本不起作用:

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

这个可以工作,但是当视图翻转时会立即再次弹出键盘。

InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);

这个有时有效,但 getCurrentFocus() 大多数时候返回 null 。

InputMethodManager inputManager = (InputMethodManager)            
Context.getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(),      
InputMethodManager.HIDE_NOT_ALWAYS);

这个只有在显示键盘时才有效:

getInstrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);

这不像第一段代码那样与 EditText 一起使用,但与根布局一起使用,它会随着方向变化和每次调用 oncreate 时发生变化。对于横向/纵向和普通/大,我有不同的布局 XML。所有根布局都有 ID root。这第一次工作得很好,但在那之后,它就不再工作了。

InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(findViewById(R.id.root).getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

底线:我已经尝试了很多软键盘隐藏方法,但它们似乎都不能可靠地工作。什么方法可以可靠地隐藏软键盘吗?

4

7 回答 7

9

我认为如果你处理 getCurrentFocus() 的 null 情况,你就可以开始了。我使用下面的方法,它就像一个魅力!

     /* Hide Keyboard */
    public static void hideKeyboard(Activity activity){
        InputMethodManager inputMethodManager = (InputMethodManager)activity
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        View focus = activity.getCurrentFocus();
        if(focus != null)
            inputMethodManager.hideSoftInputFromWindow(focus.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }
于 2012-10-23T14:38:00.893 回答
8

由于您需要调出EditText键盘,请找到特定的键盘并使用您显示的第一种方法来隐藏键盘:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

但是,您将需要它EditText。首先,获取所有视图:

public static ArrayList<View> getAllViewsFromRoots(View...roots) {
    ArrayList<View> result = new ArrayList<View>();
    for (View root : roots) {
        getAllViews(result, root);
    }
    return result;
}

private static void getAllViews(ArrayList<View> allviews, View parent) {
    allviews.add(parent);
    if (parent instanceof ViewGroup) {
        ViewGroup viewGroup = (ViewGroup)parent;
        for (int i = 0; i < viewGroup.getChildCount(); i++) {
            getAllViews(allviews, viewGroup.getChildAt(i));
        }
    }
}

然后,得到一个EditText可见的。

public static EditText getEditText(View root) {
    ArrayList<View> views = getAllViewsFromRoots(root);
    for (View view : views) {
        if (view instanceof EditText && view.getVisibility() == View.VISIBLE) {
            return (EditText) view;
        }
    }
    return null;
}

在某处打电话:

Toolkit.getEditText(((ViewParent) findViewById(android.R.id.content)).getChildAt(0));

这样,调用隐藏方法。

于 2013-01-27T07:25:46.337 回答
4

这个总是对我有用:

InputMethodManager im = (InputMethodManager) getSystemService(MyActivity.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
于 2012-10-23T14:29:50.633 回答
1

科特林。把它放在常见的 BaseActivity 上。只需在活动中的任何地方调用 hideKeyboard() 方法,类似适用于 Fragment。

open class BaseActivity : AppCompatActivity() {

fun Fragment.hideKeyboard() {
    view?.let { activity?.hideKeyboard(it) }
}

fun Context.hideKeyboard(view: View) {
    val inputMethodManager = getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)
}

}
于 2021-07-31T06:04:41.193 回答
0

只有这个解决方案对我有用:

mActivity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

我有一个带有输入字段的对话框,隐藏对话框并没有隐藏平板电脑上的键盘。

于 2014-03-24T17:21:16.867 回答
0

这应该适用于大多数情况。

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(new View(this).getWindowToken(), 0);

也无需担心空指针。

于 2014-10-22T06:41:43.340 回答
0

试试这个:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
于 2022-01-20T02:38:50.173 回答