【问题标题】:I can't hide the virtual keyboard on Android我无法在 Android 上隐藏虚拟键盘
【发布时间】:2013-12-23 14:57:54
【问题描述】:

我正在使用支持库处理片段并在片段中嵌套片段。

我有一个场景,我从现有片段中添加一个新片段(其中包含一个 EditText)。当用户点击 EditText 时,会显示一个虚拟键盘。但是当键盘打开时,用户可以从 ActionBar 中按下主页按钮,这会从堆栈中删除片段,但键盘仍然保持打开状态。我无法强制关闭键盘,我尝试了所有代码 sn-ps。鉴于所描述的场景,谁能指导我如何解决这个问题?

编辑:我创建了一个回调函数,我从片段 onDestroy 中调用它。承载所有 Fragment 的 MainActivity 实现了这个回调:

@Override
public void onHideSoftKeyboard(EditText editText) {
    // HIDE SOFT KEYBOARD HERE 

final InputMethodManager imm = (InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

     Toast.makeText(this,"KEYBOARD HIDDEN",Toast.LENGTH_LONG).show();
}

我收到 Toast 消息,并且片段在后退按钮(ActionBar 后退按钮)上被销毁,只有键盘仍然存在。

@Override
public void onDestroy() {
    hideSoftKeyboard.onHideSoftKeyboard(editTextComment);



    super.onDestroy();
}

【问题讨论】:

标签: android android-fragments android-softkeyboard android-virtual-keyboard


【解决方案1】:

尝试用这个强制键盘:

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

你也可以这样:

imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);  

如果您想在用户单击向上主页按钮时隐藏,请在您的 onOptionsItemSelected 方法中尝试这样:

case android.R.id.home:  
     // count the active fragment
     if(getSupportFragmentManager().getStackBackEntryCount() > 0) {
         // hide soft method as above
         InputMethodManager mImm = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE); 
         mImm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
         // do the pop backstack
         getSupportFragmentManager().popBackStack(); 
     } else {  
         // some stuff like finish the activity
     }
     return true;
// other items...

当您使用(覆盖)onBackPressed 方法时,您可以对后退按钮执行相同的操作。

【讨论】:

  • 我已经尝试将这个 sn-p(参考我的 EditText)放在片段的 onDestroy 中,但键盘仍然存在 :(
  • @SpeedDemon 我编辑了我的答案,我在我的 FragmentActivity 中使用了这个 sn-p 并且适用于 Fragment 和 backstack 方法。
  • 好的,谢谢,我将不得不玩这个,看看会发生什么
  • 我可以从片段内的按钮单击中隐藏键盘,但我无法检测到 ActionBar 主页按钮的单击(从这个片段中,它的行为类似于向上胡萝卜)。我正在使用 case android.R.id.home 在 onOptionsItemSelected 中进行切换案例:但什么都没有..它只是从堆栈中删除片段但不执行我放在那里的行。我真的很困惑
  • 如果您将关闭键盘的代码放在片段的 onStop 而不是 onDestroy 中,它似乎可以工作。在 onDestroy 中 getWindowToken 返回 null,但在 onStop 中没有。
【解决方案2】:

您可以使用以下代码。

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
}

【讨论】:

    【解决方案3】:

    我已经用以下方法解决了这个问题。首先,如果要在activity启动时自动弹出键盘,在onCreate方法中编写如下代码。

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

    然后,如果要关闭键盘,请使用以下内容。

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

    【讨论】:

      【解决方案4】:

      我用下一个解决方案解决了这个问题

      您需要从 BaseFragment 扩展您的每个片段,如下所示:

      public class BaseFragment extends Fragment {
      
          @Override
          public void onDestroyView() {
              hideKeyboard(getView());
              super.onDestroyView();
          }
      
          public void hideKeyboard(View view) {
              if(view != null) {
                  InputMethodManager imm = (InputMethodManager) getContext()
                          .getSystemService(Context.INPUT_METHOD_SERVICE);
                  imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
              }
          }
      }
      

      所有你想在键盘关闭时隐藏的片段,必须扩展 BaseFragment:

      public class EditTextFragment extends BaseFragment {
      ...
      }
      

      作为每个扩展片段的奖励,您可以在片段中的任何位置使用hideKeyboard(View view) 方法隐藏键盘

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        • 1970-01-01
        • 2010-12-31
        • 1970-01-01
        • 2023-02-02
        • 1970-01-01
        相关资源
        最近更新 更多