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?!
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);
}
}
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);
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);
}
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);
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);
Essaye ça
InputMethodManager imgr = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imgr.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
editText.requestFocus();
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);