J'ai une FragmentActivity
utilisant une ViewPager
pour servir plusieurs fragments. Chacune est une ListFragment
avec la disposition suivante:
<?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>
Lorsque vous démarrez l’activité, le clavier virtuel s’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);
}
J'enregistre le paramètre ViewGroup container
incoming de onCreateView
comme moyen d'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 de container
, c’est-à-dire:
imm.hideSoftInputFromWindow(myInflatedLayout.getWindowToken(), 0);
mais cela a jeté 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 dois-je créer une méthode dans la variable FragmentActivity
et l'appeler à partir du fragment?
Tant que votre fragment crée une vue, vous pouvez utiliser l'IBinder (jeton de fenêtre) à partir de cette vue après il a été 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);
}
Seule la ligne de code suivante a fonctionné pour moi:
getActivity().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Si vous ajoutez l'attribut suivant à la définition du manifeste de votre activité, le clavier ne sera plus éjecté à l'ouverture de l'activité. Espérons 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;
}
Conserver une instance de ma vue racine dans ma classe
View view;
public void onCreate(View rootView) {
view = rootView;
Utiliser la vue pour cacher 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é, mais uniquement la première EditText
de la Dialog
incorporée
this.getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
en fragment Travailler ce code
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
ce sera travail dans mon cas quand dans les onglets 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);
}
}
}
Utilisez cette méthode statique, où que vous soyez (Activité/Fragment).
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()))
.
À Kotlin:
(activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(view?.windowToken,0)
Ajoutez simplement cette ligne dans votre code:
getActivity().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Rien de tout cela n'a fonctionné sur API27. Je devais ajouter ceci dans le conteneur de la mise en page, pour moi c'était un ConstraintLayout:
<Android.support.constraint.ConstraintLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:focusable="true"
Android:focusableInTouchMode="true"
Android:focusedByDefault="true">
//Your layout
</Android.support.constraint.ConstraintLayout>