Intereting Posts

Как скрыть мягкую клавиатуру внутри фрагмента?

У меня есть ViewPager FragmentActivity использующая ViewPager для обслуживания нескольких фрагментов. Каждый из них – это 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); } 

Я сохраняю входящий параметр ViewGroup container из onCreateView в качестве способа доступа к токену окна для основного действия. Это выполняется без ошибок, но клавиатура не скрывается от вызова hideSoftInputFromWindow в onStart .

Первоначально я пытался использовать раздутый макет вместо container , то есть:

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

Но это NullPointerException , предположительно потому, что сам фрагмент не является активным и не имеет уникального оконного токена?

Есть ли способ скрыть мягкую клавиатуру внутри фрагмента или создать метод в FragmentActivity и вызвать его из фрагмента?

Solutions Collecting From Web of "Как скрыть мягкую клавиатуру внутри фрагмента?"

Пока ваш фрагмент создает представление, вы можете использовать IBinder (токен окна) из этого представления после его присоединения. Например, вы можете переопределить 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); 

Если вы добавите следующий атрибут в определение манифеста вашей активности, он полностью отключит клавиатуру от появления при открытии вашей активности. Надеюсь, это поможет:

(Добавьте в определение манифеста вашей деятельности):

 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 , фокус встроенного Dialog должен быть скрыт, вместо этого только первый EditText внутри встроенного Dialog

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

In Fragemnt Работа с этим кодом

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