web-dev-qa-db-fra.com

Afficher/masquer le clavier virtuel Android sur le remplacement de fragment

J'ai une activité avec un fragment. Disons un fragment de liste avec une liste de choses. Maintenant, je veux laisser l'utilisateur ajouter quelque chose, donc j'utilise FragmentManager pour remplacer le fragment de liste par un fragment d'insertion qui a un EditText. Le texte d'édition a le focus et le curseur clignote. Mais la palette de touches ne s'ouvre pas ... Même chose que si l'utilisateur a saisi la nouvelle chose et l'a ajoutée à la liste, je remplace le fragment d'insertion par un fragment de liste. Mais bien qu'il n'y ait plus de texte d'édition, le clavier ne se ferme pas.

Quelle est la bonne façon de mettre en œuvre cela? Je ne peux pas croire que je dois afficher et masquer le clavier manuellement sur toutes les transitions?! 

22
Maniac

Je voudrais faire les choses suivantes:

1. Extension de la classe Fragment
2. Ignorer les rappels onAttach() et onDetach()
3. Implémenter la méthode d'affichage et de masquage du clavier logiciel

exemple de code:

class MyFragment extends Fragment {
   @Override
   public void onAttach(Activity activity) {
       super.onAttach(activity);

       //show keyboard when any fragment of this class has been attached
       showSoftwareKeyboard(true);
   }

   @Override
   public void onDetach() {
       super.onDetach();

       //hide keyboard when any fragment of this class has been detached
       showSoftwareKeyboard(false);
   }

   protected void showSoftwareKeyboard(boolean showKeyboard){
       final Activity activity = getActivity();
       final InputMethodManager inputManager = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);

       inputManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), showKeyboard ? InputMethodManager.SHOW_FORCED : InputMethodManager.HIDE_NOT_ALWAYS);
   }
}
5
bpawlowski

Pour afficher le clavier:

editText.requestFocus();
InputMethodManager keyboard = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.showSoftInput(editText, 0);

et ensuite le cacher:

InputMethodManager keyboard = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.hideSoftInputFromWindow(editText.getWindowToken(), 0);
4
Jeremy Dowdall

J'ai le même problème avec mon application et nous avons finalement 2 options. Tout d'abord, créez une fonction générale et appelez-la dans toutes les transitions ou créez une transition globale. Pour cela:

public static void RemoveAndReplaceFragment(FragmentManager fragmentManager, int FragmentContent, Fragment PlaceHolderFragment,Activity context){
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.remove(fragmentManager.findFragmentById(R.id.frgMainActivity))
                .commit();

        //Close keyBoard in transition
        InputMethodManager inputManager = (InputMethodManager) context.getSystemService(
                Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(context.getCurrentFocus().getWindowToken(),
                InputMethodManager.HIDE_NOT_ALWAYS);

        fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.setCustomAnimations(R.anim.animation_fade_in,R.anim.animation_fade_out);
        fragmentTransaction.replace(R.id.frgMainActivity, new PlaceholderFragment_MainActivity_AcceptAndFollowTask()).commit();
    }
}

Le meilleur moyen est de capturer l'événement de transition mais nous ne pouvons pas en ce moment ... Dis-moi si je t'aide, bonne chance!

Cela fonctionnera à coup sûr:

private void hideKeyboard() {   
    // Check if no view has focus:
    View view = this.getCurrentFocus();
    if (view != null) {
        InputMethodManager inputManager = (InputMethodManager) this.getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
    }

    private void showKeyboard(){
    EditText myEditText = (EditText) findViewById(R.id.myEditText);  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
   }
1

J'imagine que votre ListView vole l'objet de votre EditText, essayez ceci et dites-moi si cela vous aidera.

getListView().setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
0
Bojan Kseneman

vous pouvez utiliser le code ci-dessous pour masquer le clavier logiciel.

InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
0
Durgesh

Essaye ça 

InputMethodManager imgr = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);

    imgr.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
    editText.requestFocus();
0
gunjan luthra

Je suis d'accord, je ne pouvais pas croire que vous deviez également masquer manuellement le clavier. 

Ajoutez ceci à votre fragment onCreate que vous ne voulez pas que le clavier ne soit pas:

   ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(mToolbar.getWindowToken(), 0);

changez mToolbar en n’importe quelle vue de la mise en page. Dans ce cas, j'ai utilisé ma barre d'outils. 

Ajoutez ceci au fragment onCreate pour que le clavier soit affiché. 

        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
0
Eugene H