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 .

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.

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(); } 
  • Fragment Compatability onActivityResult () No funciona
  • ¿Puedo establecer atributos de nivel de API X en mi manifiesto cuando mi minSdkVersion es menor que X?
  • Comprobación de las infracciones de android: minSdkVersion automáticamente
  • Android: "El elemento intento-filtro no está permitido aquí" dentro de <proveedor>?
  • Manifiesto de Android Studio Faltando error en Gradle
  • Modo de lanzamiento "single top" de Android y método onNewIntent
  • Permiso de herramientas de desarrollo que no establecí
  • Nombre de icono de la aplicación Android escogido de la etiqueta de actividad que de la etiqueta de la aplicación
  • AppCompatActivity no se puede asignar a Actividad
  • ActionBar no funciona al extender ListActivity
  • Nombre del paquete de manifiesto de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.