java - studio - ¿Cómo esconder el teclado virtual desde dentro de un fragmento?
ocultar teclado android studio (6)
Tengo FragmentActivity
usando ViewPager
para servir varios fragmentos. Cada uno es un ListFragment
con el siguiente diseño:
<?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>
Al comenzar la actividad, se muestra el teclado virtual. Para remediar esto, hice lo siguiente dentro del fragmento:
@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
parámetro del ViewGroup container
entrante de onCreateView
como una forma de acceder al token de la ventana para la actividad principal. Esto se ejecuta sin error, pero el teclado no se oculta de la llamada a hideSoftInputFromWindow
en onStart
.
Originalmente, traté de usar el diseño inflado en lugar de container
, es decir:
imm.hideSoftInputFromWindow(myInflatedLayout.getWindowToken(), 0);
pero esto arrojó una NullPointerException
, presumiblemente porque el fragmento en sí no es una actividad y no tiene un token de ventana único.
¿Hay alguna manera de ocultar el teclado virtual desde un fragmento, o debería crear un método en FragmentActivity
y llamarlo desde el fragmento?
Nada más que la siguiente línea de código funcionó para mí:
getActivity().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
Si agrega el siguiente atributo a la definición del manifiesto de su actividad, suprimirá por completo que el teclado aparezca cuando se abra su actividad. Espero que esto ayude:
(Agregar a la definición del manifiesto de su actividad):
android:windowSoftInputMode="stateHidden"
Siempre que su Fragmento cree una Vista, puede usar el IBinder (token de ventana) de esa vista después de que se haya adjuntado. Por ejemplo, puede anular onActivityCreated en su Fragmento:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
}
DialogFragment
embargo, la excepción para DialogFragment
, el foco del Dialog
incrustado debe estar oculto, en su lugar, solo el primer EditText
dentro del EditText
Dialog
incrustado.
this.getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
en Fragemnt trabajando este código
getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
@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;
}
Mantener una instancia de mi vista de root en mi clase
View view;
public void onCreate(View rootView) {
view = rootView;
Use la vista para ocultar el teclado
public void removePhoneKeypad() {
InputMethodManager inputManager = (InputMethodManager) view
.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
IBinder binder = view.getWindowToken();
inputManager.hideSoftInputFromWindow(binder,
InputMethodManager.HIDE_NOT_ALWAYS);
}