Ocultar / Mostrar programáticamente el teclado suave de Android

Posible duplicado:
Cerrar / ocultar el teclado suave de Android

Lo primero es lo primero que ya vi este hilo. Probé los métodos aceptados allí … Pero nada funcionó para mí …

Tengo dos pantallas en mi aplicación.

  • El primero tiene 2 EditText’s – Uno para nombre de usuario y otro para contraseña
  • El segundo tiene un ListView, y un EditText – para filtrar el listView

En mi primera pantalla, quiero que el nombre de usuario EditText se enfoque en el inicio y que el teclado esté visible. Esta es mi implementación (simplificada al eliminar códigos innecesarios / no relacionados).

app_login.xml

    

AppLogin.java

 class AppLogin extends Activity{ private EditText mUserNameEdit = null; private EditText mPasswordEdit = null; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.app_login); mUserNameEdit = (EditText) findViewById(R.id.username); mPasswordEdit = (EditText) findViewById(R.id.password); /* code to show keyboard on startup.this code is not working.*/ InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(mUserNameEdit, InputMethodManager.SHOW_IMPLICIT); }//End of onCreate() } 

Bueno, el teclado no se muestra al inicio . Y mi diseño requiere mucho un teclado allí …

Ahora en la segunda página … Ya he dicho que tengo una lista Ver y Editar Texto allí … Quiero que mi teclado esté oculto en el inicio solo para que aparezca cuando el usuario toque el texto de edición ¿Puedes creerlo? todo lo que probé, el Teclado suave se muestra cuando cargo la actividad … No puedo ocultarlo.

app_list_view.xml

     

AppList.java

 public class MyListActivity extends ListActivity{ private EditText mfilterEditText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.app_list_view); mFilterEditText = (EditText) findViewById(R.id.filter_edittext); InputMethodManager imm = InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(mFilterEditText.getWindowToken(), 0); } } 

Simplificar

  1. En la página de inicio de sesión (primera página), quiero que mi teclado esté visible en el inicio.
  2. En SecondPage quiero que el teclado esté oculto primero, solo para que aparezca cuando el usuario toque editText

Y mi problema es que estoy obteniendo exactamente lo contrario en ambas ocasiones … Espero que alguien haya enfrentado este problema antes … BTC Estoy probando en el simulador y en el teléfono HTC Desire …

RESULTADO FINAL

Bueno, lo tengo funcionando, con la ayuda de todos los amigos aquí.

1. Para mostrar el teclado al inicio

Dos respuestas funcionaron para mí. Uno proporcionado por @CapDroid, que consiste en utilizar un controlador y publicarlo con retraso.

 mUserNameEdit.postDelayed(new Runnable() { @Override public void run() { // TODO Auto-generated method stub InputMethodManager keyboard = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); keyboard.showSoftInput(mUserNameEdit, 0); } },50); 

Las segundas respuestas son proporcionadas por @Dyarish, de hecho se vinculó a otro hilo SO, que no he visto antes. Pero lo curioso es que esta solución se da en el hilo al que hice referencia al inicio. Y no lo he probado porque tenía cero votos en un hilo donde todos los demás mensajes tienen muchos votos … La altura de la insensatez …

 getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 

Para mí, la segunda solución parecía ordenada, así que decidí seguir con eso … Pero la primera ciertamente funciona. También la respuesta de @ Dyarish contiene un truco ingenioso de usar ScrollView debajo de EditText para darle a EditText el enfoque … Pero no lo he intentado, pero debería funcionar. Aunque no está nada ordenado …

2. Para ocultar el teclado al inicio de la actividad

Solo una respuesta funcionó para mí, que es proporcionada por @Dyarish. Y la solución es usar la configuración FocusTouchMode enfocable en xml para el diseño que contiene el texto de EditText. Esto hizo el truco

     

De todos modos, termino usando la respuesta de Dyarish en ambos casos. Así que le estoy otorgando la recompensa … Gracias a todos los otros amigos que trataron de ayudarme …

    Agregando esto a su código android:focusableInTouchMode="true" se asegurará de que su teclado no aparezca en el inicio para su cuadro de texto de edición. Desea agregar esta línea a su diseño lineal que contiene EditTextBox. Deberías poder jugar con esto para resolver tus dos problemas. He probado esto Solución simple.

    es decir: en su archivo app_list_view.xml

         

    —————— EDIT: para hacer que el teclado aparezca al inicio ———————–

    Esto es para hacer que el teclado aparezca en el nombre de usuario edittextbox al inicio. Todo lo que he hecho se agrega una vista de desplazamiento vacía en la parte inferior del archivo .xml, esto pone el primer texto de edición en foco y aparece el teclado. Admito que esto es un hack, pero supongo que solo quieres que esto funcione. Lo probé y funciona bien.

     < ?xml version="1.0" encoding="utf-8"?>       

    Si está buscando una solución más eloquent, he encontrado esta pregunta que podría ayudarlo, no es tan simple como la solución anterior, pero probablemente sea una solución mejor. No lo he probado, pero al parecer funciona. Creo que es similar a la solución que has probado que no te funcionó.

    Espero que esto es lo que estás buscando.

    ¡Aclamaciones!

    ACTUALIZACIÓN 2

     @Override protected void onResume() { super.onResume(); mUserNameEdit.requestFocus(); mUserNameEdit.postDelayed(new Runnable() { @Override public void run() { // TODO Auto-generated method stub InputMethodManager keyboard = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); keyboard.showSoftInput(mUserNameEdit, 0); } },200); //use 300 to make it run when coming back from lock screen } 

    Intenté mucho y descubrí una solución … cada vez que se inicia una nueva actividad, el teclado no se puede abrir, pero podemos usar Runnable en onResume y está funcionando bien así que intente con este código y verifique …

    ACTUALIZACIÓN 1

    agregue esta línea en su AppLogin.java

     mUserNameEdit.requestFocus(); 

    y esta línea en tu AppList.java

     listview.requestFocus()' 

    después de esto, compruebe su aplicación si no está funcionando, luego agregue esta línea en su archivo AndroidManifest.xml

       

    RESPUESTA ORIGINAL

      InputMethodManager imm = (InputMethodManager)this.getSystemService(Service.INPUT_METHOD_SERVICE); 

    para ocultar el teclado

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

    para mostrar el teclado

      imm.showSoftInput(ed, 0); 

    para centrarse en EditText

      ed.requestFocus(); 

    donde ed es EditText

    Prueba este código

    Para mostrar Softkeyboard:

     InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if(imm != null){ imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0); } 

    Para ocultar SoftKeyboard –

     InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if(imm != null){ imm.toggleSoftInput(0, InputMethodManager.HIDE_IMPLICIT_ONLY); } 

    ¿ InputMethodManager.SHOW_IMPLICIT en la primera ventana?

    y para esconderse en la segunda ventana usa InputMethodManager.HIDE_IMPLICIT_ONLY

    EDITAR:

    Si todavía no funciona, probablemente lo esté colocando en el lugar equivocado. Anular en onFinishInflate() y mostrar / ocultar allí.

     @override public void onFinishInflate() { /* code to show keyboard on startup */ InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(mUserNameEdit, InputMethodManager.SHOW_IMPLICIT); }