【问题标题】:Hide soft keyboard after dialog dismiss对话框关闭后隐藏软键盘
【发布时间】:2012-07-22 22:39:07
【问题描述】:

我想在 AlertDialog 关闭后隐藏软键盘,但它仍然可见。这是我的代码:

alert = new AlertDialog.Builder(MyActivity.this);
imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

alert.setOnDismissListener(new DialogInterface.OnDismissListener() {

    @Override
    public void onDismiss(DialogInterface dialog) {
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
    }
});

【问题讨论】:

  • 您可以在这里找到解决方案:workingfromhere.com/blog/2011/04/27/… 或在这里:stackoverflow.com/questions/1109022/…
  • 两种方法都使用 EditText 视图,但我没有。我没有EditText。这是我的 SettingsActivity 中的对话框。当它关闭时键盘显示:(
  • 如果您的键盘弹出对话框,这意味着您的对话框中必须有一个 EditText。所以你可以通过传递你的EditText的window-token来编写上面的代码,然后调用dialog.dismiss()
  • 或者如果不是上述情况.. 意味着如果 Edittext 不在您的对话框中,您需要检查它弹出的 EditText 并在显示对话框之前隐藏它。如果这也不起作用,请发布您的代码。

标签: android keyboard hide android-softkeyboard soft-keyboard


【解决方案1】:

如果有人在 kotlin 中寻找这个,那就是:

private fun hideDeviceKeyboard() {
    val imm = context!!.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
}

【讨论】:

    【解决方案2】:
    protected void hideKeyboard() {
        final Activity activity = getActivity();
        final View view = activity != null ? activity.getCurrentFocus() : null;
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                if (view != null) {
                    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
                    if (imm != null)
                        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
                }
            }
        }, 1);
    }
    
    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        hideKeyboard();
    }
    

    【讨论】:

      【解决方案3】:

      这行得通!这将在对话框关闭后关闭键盘

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

      【讨论】:

      • 在尝试了太多解决方案后终于成功了。很好的是它不需要任何视图并检查它的焦点。
      • 但是,你应该检查焦点是否存在,否则如果它被隐藏,键盘就会出现
      【解决方案4】:

      在清单 xml

      android:windowSoftInputMode="stateAlwaysHidden"
      

      在关闭Dialog时会自动隐藏软键盘

      【讨论】:

      • 这应该是公认的答案!覆盖 AndroidManifest.xml 中声明的属性是一种不好的做法
      • @Renjith 你能详细说明为什么它不好
      • 它对我不起作用,但 edittext hidden (edittext inside dialog) 和 dialog.dismiss 完成了这项工作
      • @SeshuVinay,我只是一个不起眼的工程师,但如果时代召唤我,我将成为蝙蝠侠 :) 保重伙伴! :)
      • 哇,我生命中的 2 个小时已经过去了,谢谢 Android:D
      【解决方案5】:

      我在关闭警报对话框时遇到了类似的问题。这似乎对我有用。

      在你的 DialogFragment 中

      public static void closeKB(final View view) 
      {
          caller.postDelayed(new Runnable() {
              @Override
              public void run() {
                  InputMethodManager imm = (InputMethodManager) view.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                  imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
              }
          }, 1);
      }
      
      @Override
      public void onDismiss(DialogInterface dialog)
      {
          super.onDismiss(dialog);
                  View view = getActivity().getCurrentFocus();
          if (view != null)
          {
              closeKB(view);
          }
      }
      

      【讨论】:

        【解决方案6】:

        所有这些使用 InputMethodManager 的建议都有些模糊 - 确切地在哪里调用它,
        而且它们至少对我不起作用。
        是的,键盘消失了,但应用程序崩溃了!?
        主要问题是在对话框消失的同时隐藏键盘。

        为了避免这种情况,dialog.dismiss() 应该在 view.postDelayed() 之后在 imm.hideSoftInputFromWindow() 中调用,在我的情况下,我将延迟设置为 150。

        【讨论】:

          【解决方案7】:

          我遇到了同样的问题。通过这样做解决了它。它不需要任何参考:

          imm.hideSoftInputFromWindow(getWindow().getDecorView()
                          .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
          

          【讨论】:

          • 这在尝试从 DialogFragment 隐藏时正常工作
          • 但是会暂时留下白影,如何防止白影?
          • 什么是'imm'??
          • @BrenddonAnjos InputMethodManager 对象
          【解决方案8】:

          我用这个方法:

          IBinder token = searchTextEntry.getWindowToken();
          ( ( InputMethodManager ) getSystemService( Context.INPUT_METHOD_SERVICE ) ).hideSoftInputFromWindow( token, 0 );
          

          其中searchTextEntry 是我的EditText 参考的名称。

          【讨论】:

          • 我没有 EditText。这是我的 SettingsActivity 中的对话框。当它关闭时键盘显示:(
          • 工作。但是必须为“hideFlags:”添加一个数字。所以 "...(token, showFlags: 0, hideFlags:0);"
          猜你喜欢
          • 2016-10-22
          • 2012-01-21
          • 2013-12-09
          • 1970-01-01
          • 1970-01-01
          • 2015-09-04
          • 2017-06-07
          • 2014-07-19
          • 2011-08-29
          相关资源
          最近更新 更多