如何隐藏片段内的软键盘?

我有一个使用ViewPager服务几个片段的FragmentActivity 。 每个是具有以下布局的ListFragment

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="8dp"> <ListView android:id="@id/android:list" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <EditText android:id="@+id/entertext" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout> 

当开始活动时,软键盘显示。 为了解决这个问题,我在片段内部做了以下操作:

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //Save the container view so we can access the window token viewContainer = container; //get the input method manager service imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); . . . } @Override public void onStart() { super.onStart(); //Hide the soft keyboard imm.hideSoftInputFromWindow(viewContainer.getWindowToken(), 0); } 

我保存来自onCreateView的传入ViewGroup container参数,作为访问主活动的窗口标记的一种方法。 这运行没有错误,但键盘不隐藏调用hideSoftInputFromWindow中的hideSoftInputFromWindow

最初,我尝试使用膨胀的布局,而不是container ,即:

 imm.hideSoftInputFromWindow(myInflatedLayout.getWindowToken(), 0); 

但是这抛出了NullPointerException ,大概是因为片段本身不是一个活动,并没有一个唯一的窗口标记?

有没有办法隐藏片段内的软键盘,或者我应该在FragmentActivity创build一个方法,并从片段内调用它?

只要你的Fragment创build了一个View,你可以在附加后使用该视图中的IBinder(窗口标记)。 例如,你可以覆盖你的Fragment中的onActivityCreated:

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

没有什么,但下面的代码行为我工作:

 getActivity().getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

如果您将以下属性添加到您的活动的清单定义中,它将完全禁止在您的活动打开时popup键盘。 希望这有助于:

(添加到您的活动的清单定义):

 android:windowSoftInputMode="stateHidden" 
  @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_my, container, false); someClass.onCreate(rootView); return rootView; } 

在我的课堂上保留一个我的根视图的实例

 View view; public void onCreate(View rootView) { view = rootView; 

使用视图来隐藏键盘

  public void removePhoneKeypad() { InputMethodManager inputManager = (InputMethodManager) view .getContext() .getSystemService(Context.INPUT_METHOD_SERVICE); IBinder binder = view.getWindowToken(); inputManager.hideSoftInputFromWindow(binder, InputMethodManager.HIDE_NOT_ALWAYS); } 

但是,对于DialogFragment ,例外情况是embedded式Dialog焦点必须隐藏,而不是embedded式Dialog的第一个EditText

 this.getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 

在Fragemnt工作这个代码

  getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);