Ocultar teclado suave al presionar hacia atrás
Tengo un EditText
en una Activity
y quiero que sea activo y el teclado suave esté abierto cuando abro esa Activity
. Aquí está mi xml
para EditText
:
<EditText android:background="@null" android:cursorVisible="true" android:elegantTextHeight="true" android:enabled="true" android:focusable="true" android:hint="Search" android:id="@+id/editText11" android:inputType="textNoSuggestions|textCapSentences" android:layout_centerVertical="true" android:layout_height="wrap_content" android:layout_width="match_parent" android:singleLine="true" android:textColor="#000000" android:textCursorDrawable="@null" />
y he utilizado android:windowSoftInputMode="stateVisible"
para la actividad en la que tengo este EditText
.
- No se establece el tema de Android
- Android: comprobando si la actividad se declara en Manifest en tiempo de ejecución
- Flujo de control de aplicaciones de Android?
- Android Studio - No se pudo fusionar el manifiesto de Gradle
- Icono de aplicación que falta en Android
El problema es que cuando EditText
una vez, el teclado no se esconde (idealmente lo hace en todos los demás EditText
s) y cuando vuelvo a pulsar, cierra la Activity
. En la primera back
, no estoy recibiendo una llamada a onBackPressed()
mientras que en la segunda back
, lo hago. ¿Por qué está ocurriendo este tipo de comportamiento y cómo resolverlo?
Edición Lo que quiero es, si el teclado está abierto, presionando hacia atrás debe cerrar el teclado y si el teclado no está abierto, a continuación, cierre la actividad.
- ¿Cómo se valida AndroidManifest.xml en android studio?
- Cómo editar AndroidManifest.xml en PhoneGap 3
- ¿Cómo obtengo iconos múltiples para lanzar diferentes actividades en una sola aplicación?
- ¿Cómo puedo obtener la ubicación actual en android programatically?
- Android: icono de la aplicación para depurar y liberar el modo
- Android GPS activado o desactivado
- ¿Es `android: supportsRtl =" true "` en el Manifiesto de la Biblioteca esencial? Está causando error a veces
- Especificación de un filtro de intenciones SEND (compartido) para un servicio
Prueba esto …
crear una clase llamada Util y poner este código
public static void hideSoftKeyboard(Activity activity) { final InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); if (inputMethodManager.isActive()) { if (activity.getCurrentFocus() != null) { inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0); } } }
y llame al onBackPressed () de Actividad
Añado debajo del código en mi BaseActivity.java
@Override protected void onPause() { super.onPause(); final InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE); if (inputMethodManager != null && inputMethodManager.isActive()) { if (getCurrentFocus() != null) { inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); } } }
Prueba de esta manera,
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: //useful for hiding the soft-keyboard is: getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); return true; } } return super.onKeyDown(keyCode, event); }
Esto puede ayudarte
Llame a este método en Atrás presionado
public static void hideKeyBoardMethod(final Context con, final View view) { try { view.post(new Runnable() { @Override public void run() { InputMethodManager imm = (InputMethodManager) con.getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } }); } catch (Exception e) { e.printStackTrace(); } }
Como su requisito :
si el teclado está abierto, presionando hacia atrás debe cerrar el teclado y si el teclado no está abierto, cierre la actividad
He probado mi código funciona bien.
Paso 1: Cree CustomEditText
como a continuación.
<com.yourpackage.yourappname.CustomEditText android:id="@+id/edittext" android:layout_width="match_parent" android:layout_height="wrap_content"/>
Paso 2: Cree la clase CustomEditText.java
.
public class CustomEditText extends EditText { Context context; private static Activity mSearchActivity;; public CustomEditText(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; } @Override public boolean dispatchKeyEventPreIme(KeyEvent event) { if(mSearchActivity != null && event.getKeyCode() == KeyEvent.KEYCODE_BACK){ KeyEvent.DispatcherState state = getKeyDispatcherState(); if(state != null){ if(event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0){ InputMethodManager mgr = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); mgr.hideSoftInputFromWindow(this.getWindowToken(), 0); } else if(event.getAction() == KeyEvent.ACTION_UP && !event.isCanceled() && state.isTracking(event)){ mSearchActivity.onBackPressed(); return true; } } } return super.dispatchKeyEventPreIme(event); } }
Paso 3: En su actividad intialize el CustomEditText y ocultar KeyBoard como a continuación.
CustomEditText editText = (CustomEditText) findViewById(R.id.edittext); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
Paso 4: En su actividad simplemente Override
el método onBackPressed()
.
@Override public void onBackPressed() { super.onBackPressed(); }
- ¿Cómo puedo comprobar la versión de Open Mobile API en Android?
- Prueba Espresso que ImageView contiene un dibujable