Ocultar el teclado después de llamar a una nueva actividad que muestra un ProgressDialog

Tengo problemas con el teclado en pantalla. Tengo una actividad con un EditText que muestra el teclado, y un botón para ir a una segunda actividad. La segunda actividad muestra una ProgressDialog en sus onCreate(), hace cosas y despide a los ProgressDialog. El problema es que mientras el ProgressDialog se muestra, al igual que el teclado.

Me gustaría que el teclado desapareciera antes de crear el ProgressDialog. Busqué a fondo tanto en StackOverflow como en otros sitios, pero nada parece funcionar con este escenario en particular.

Adjunto dos fotos para su referencia:

Este es el código de la primera actividad:

public class FirstActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
                startActivity(intent);
            }
        });
    }
}

y este es el código de la segunda actividad:

public class SecondActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);

        // TODO: hide keyboard here

        final ProgressDialog dialog = ProgressDialog.show(this, "", "Please wait...", true, false, null);

        // in real code, here there is an AsyncTask doing stuff...
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                dialog.dismiss();
            }
        }, 5000);
    }
}

Muchas Gracias

preguntado el 03 de mayo de 12 a las 11:05

Echa un vistazo a esto: stackoverflow.com/a/3858873/1321873 -

@Rajesh, ya lo intenté, no se aplica aquí. La segunda actividad debe ocultar el teclado, incluso si el teclado fue mostrado por otra actividad. -

5 Respuestas

Resuelto usando una variación de la técnica publicada por phalt:

InputMethodManager im = (InputMethodManager) this.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

Este código funciona correctamente durante onCreate/onStart/onResume, ya que no se basa en una vista enfocada para obtener el token de ventana.

contestado el 03 de mayo de 12 a las 13:05

Escriba este código en el archivo manifest.xml para la actividad 'SecondActivity'.

<activity name="EditContactActivity"
    android:windowSoftInputMode="stateAlwaysHidden">
    ...
</activity>

contestado el 03 de mayo de 12 a las 11:05

Esta no es una opción viable para mí, ya que el diseño de la segunda actividad puede incluir un EditText (determinado por el resultado de AsyncTask). - Venator85

Encontré que esto era útil, por lo que el teclado aparecía cuando era necesario, pero no automáticamente al cargar la pantalla: android:windowSoftInputMode="stateHidden" - Mark Freeman

necesita stateAlwaysHidden|adjustNothing no solo stateAlwaysHidden - Odaym

puedes usar así también:

InputMethodManager imm;

Escriba debajo de la línea en el método onCreate ():

imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

Y esta línea está en onclick of button:

imm.hideSoftInputFromWindow(arg0.getWindowToken(), 0);

Ejemplo:

public class FirstActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {

            imm.hideSoftInputFromWindow(arg0.getWindowToken(), 0);
            Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
            startActivity(intent);
        }
    });
}
}

contestado el 03 de mayo de 12 a las 11:05

Esto normalmente funciona, pero la segunda actividad está en un proyecto de biblioteca, mientras que la primera actividad está en otro proyecto que usa este proyecto de biblioteca. Por lo tanto, como no tengo control sobre la primera actividad, la segunda actividad debe manejar directamente la ocultación del teclado. - Venator85

Si en clase de fragmento

@Override
    public void onResume()
    {
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        super.onResume();
        }

Si está en la clase de actividad

 @Override
    public void onResume()
    {
        this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        super.onResume();
        FetchLocation fl = new FetchLocation(mContext, locationResult);
    }

Respondido el 18 de junio de 15 a las 11:06

Has probado:

InputMethodManager im = (InputMethodManager)
this.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);

im.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(),
InputManagerMethod.HIDE_NOT_ALWAYS);

Este es el código que introduzco en los puntos en los que quiero ocultar el teclado.

contestado el 03 de mayo de 12 a las 11:05

Bloquea la aplicación con una NullPointerException ya que en onCreate (obviamente después de setContentView), onStart y onResume aún no hay una vista enfocada. - Venator85

De acuerdo, ¿ha intentado configurar el teclado como oculto en el manifiesto de actividad y luego dejar que se muestre después a través del código? Editar: por ejemplo: tome la respuesta de Krishna Suthar a continuación y luego invierta mi código para que el teclado puede ser usado. - falto

Esto arrojará una excepción de puntero nulo porque intentará obtener el enfoque actual y no obtendrá uno. Intente ejecutar un script de mono en su código. En un momento, podría darte un puntero nulo. - shaktiman_droid

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.