我正在使用支持库处理片段并在片段中嵌套片段。
我有一个场景,我从现有片段中添加一个新片段(其中包含一个 EditText)。当用户点击编辑文本时,将显示虚拟键盘。但是,当键盘打开时,用户可以从操作栏中按主页按钮,这会从堆栈中删除片段,但键盘仍保持打开状态。我无法在键盘上强制关闭,我尝试了所有代码片段。鉴于所描述的情况,任何人都可以指导我如何解决这个问题?
编辑:我做了一个回调函数,我从片段中调用它破坏。托管所有片段的主活动实现此回调:
@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 消息,后退按钮(动作栏后退按钮)上的片段被销毁,只有键盘仍然存在。
@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 扩展每个片段,如下所示:
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)
方法在片段中的任何位置隐藏键盘