Tengo un FragmentActivity
uso de ViewPager
para servir varios fragmentos. Cada uno tiene ListFragment
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 iniciar la actividad, aparece el teclado en pantalla. 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);
}
Guardo el ViewGroup container
parámetro entrante de onCreateView
como una forma de acceder al token de ventana para la actividad principal. Esto se ejecuta sin errores, pero el teclado no se oculta de la llamada a hideSoftInputFromWindow
in onStart
.
Originalmente, intenté usar el diseño inflado en lugar de container
, es decir:
imm.hideSoftInputFromWindow(myInflatedLayout.getWindowToken(), 0);
pero esto arrojó un NullPointerException
, presumiblemente porque el fragmento en sí no es una actividad y no tiene un token de ventana único.
¿Hay alguna forma de ocultar el teclado virtual desde dentro de un fragmento, o debería crear un método en el FragmentActivity
y llamarlo desde dentro del fragmento?
Nada más que la siguiente línea de código funcionó para mí:
fuente
SOFT_INPUT_STATE_HIDDEN
también funcionó para mí, aunque no sé cuál es la diferencia entre eso y 'SOFT_INPUT_STATE_ALWAYS_HIDDEN'.Si agrega el siguiente atributo a la definición del manifiesto de su actividad, evitará por completo que el teclado salte cuando se abra su actividad. Ojalá esto ayude:
(Agregue a la definición de manifiesto de su actividad):
android:windowSoftInputMode="stateHidden"
fuente
@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 raíz en mi clase
View view; public void onCreate(View rootView) { view = rootView;
Usa 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); }
fuente
Sin
DialogFragment
embargo, con la excepción de que el foco del incrustadoDialog
debe estar oculto, solo el primeroEditText
dentroDialog
this.getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
fuente
override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)}
Este código funciona para fragmentos:
fuente
Utilice este método estático, desde cualquier lugar (Actividad / Fragmento) que desee.
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 desea utilizar para fragmento, simplemente llame
hideKeyboard(((Activity) getActivity()))
.fuente
esto funcionará en mi caso cuando en las pestañas cambie de un fragmento a otro fragmentos
@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); } } }
fuente
Nada de esto funcionó en API27. Tuve que agregar esto en el contenedor del diseño, para mí era 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>
fuente
Esto funcionó para mí en la clase de Kotlin
fun hideKeyboard(activity: Activity) { try { val inputManager = activity .getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager val currentFocusedView = activity.currentFocus if (currentFocusedView != null) { inputManager.hideSoftInputFromWindow(currentFocusedView.windowToken, InputMethodManager.HIDE_NOT_ALWAYS) } } catch (e: Exception) { e.printStackTrace() } }
fuente
Use este código en cualquier escucha de botón de fragmento:
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(getActivity().INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
fuente
getActivity().getCurrentFocus().getWindowToken()
no es nulo, de lo contrario causará un error si no hay un editText enfocado. Vea mi respuesta a continuaciónSimplemente agregue esta línea en su código:
fuente
En Kotlin:
(activity?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).hideSoftInputFromWindow(view?.windowToken,0)
fuente
Utilizar esta:
Button loginBtn = view.findViewById(R.id.loginBtn); loginBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(getActivity().INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } });
fuente