Comment cacher le clavier souple à l’intérieur d’un fragment?

J’ai un FragmentActivity utilisant un ViewPager pour servir plusieurs fragments. Chacun est un ListFragment avec la disposition suivante:

        

Lors du démarrage de l’activité, le clavier logiciel affiche. Pour remédier à cela, j’ai fait ce qui suit à l’intérieur du fragment:

 @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 paramètre du ViewGroup container entrant sur ViewGroup container pour accéder au jeton de fenêtre de l’activité principale. Cela fonctionne sans erreur, mais le clavier n’est pas caché de l’appel à hideSoftInputFromWindow dans onStart .

A l’origine, j’ai essayé d’utiliser la disposition gonflée au lieu du container , à savoir:

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

mais cela a NullPointerException une NullPointerException , probablement parce que le fragment lui-même n’est pas une activité et n’a pas de jeton de fenêtre unique?

Existe-t-il un moyen de masquer le clavier logiciel dans un fragment, ou devrais-je créer une méthode dans FragmentActivity et l’appeler depuis le fragment?

Tant que votre fragment crée une vue, vous pouvez utiliser l’IBinder (jeton de fenêtre) à partir de cette vue après l’avoir attaché. Par exemple, vous pouvez remplacer onActivityCreated dans votre fragment:

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

Rien d’autre que la ligne de code suivante n’a fonctionné pour moi:

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

Si vous ajoutez l’atsortingbut suivant à la définition de manifeste de votre activité, le clavier sera complètement masqué lors de l’ouverture de votre activité. J’espère que cela aide:

(Ajouter à la définition du manifeste de votre activité):

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

Garder une instance de ma vue racine dans ma classe

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

Utilisez la vue pour masquer le clavier

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

Exception pour DialogFragment cependant, le focus de la Dialog incorporée doit être masqué, à la place uniquement du premier EditText dans la Dialog intégrée

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

à Fragemnt Ce Code fonctionne

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

Rien de tout cela n’a fonctionné sur API27. Je devais append ceci dans le conteneur de la mise en page, pour moi c’était un ConstraintLayout:

  //Your layout  

Utilisez cette méthode statique, de n’importe où (Activité / Fragment) que vous aimez.

 public static void hideKeyboard(Activity activity) { try{ InputMethodManager inputManager = (InputMethodManager) activity .getSystemService(Context.INPUT_METHOD_SERVICE); View currentFocusedView = activity.getCurrentFocus(); if (currentFocusedView != null) { inputManager.hideSoftInputFromWindow(currentFocusedView.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } }catch (Exception e){ e.printStackTrace(); } } 

Si vous voulez utiliser fragment, appelez simplement hideKeyboard(((Activity) getActivity())) .

ce sera un travail dans mon cas lorsque dans les tabs je passe d’un fragment à un autre fragments

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { try { InputMethodManager mImm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); mImm.hideSoftInputFromWindow(getView().getWindowToken(), 0); mImm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0); } catch (Exception e) { Log.e(TAG, "setUserVisibleHint: ", e); } } }