1

我正在使用支持库处理片段和嵌套片段。我无法在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(); 
} 

我得到的吐司消息和片段上的后退按钮被破坏(动作条后退按钮),键盘上的按键仍然存在。

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



    super.onDestroy(); 
} 
+0

请检查我的答案[在此堆栈溢出线程](http://stackoverflow.com/a/23934639/1773155)。这是对我有用的唯一方式。 –

回答

1

您可以使用以下代码。

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

试图迫使键盘这样的:

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

+0

我已经尝试把这个片段(与我的EditText的引用)在片段的onDestroy,但键盘仍然存在:( –

+0

@SpeedDemon你可以告诉我们你的代码,你试过吗? –

+0

@Prince,我编辑了文本,谢谢 –

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)方法隐藏键盘当你想在你的片段中的任何地方

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);