繁体   English   中英

我无法在Android上隐藏虚拟键盘

[英]I can't hide the virtual keyboard on Android

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

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

编辑:我做了一个回调函数,我从片段onDestroy调用。 承载所有片段的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();
}

尝试用这个强制键盘:

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方法时,可以使用后退按钮执行相同操作。

您可以使用以下代码。

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

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

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

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

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

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

您需要从BaseFragment扩展每个Fragment,如下所示:

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)方法在片段中的任何位置隐藏键盘

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM