Android: ocultar/mostrar mediante programación el teclado virtual [duplicado]

Resuelto Krishnabhadra asked hace 54 años • 4 respuestas

Posible duplicado:
¿Cómo se cierra/oculta el teclado virtual de Android mediante programación?

Lo primero es que ya vi este hilo. Probé los métodos aceptados que se indican allí, pero nada funcionó para mí.

Tengo dos pantallas en mi aplicación.

  • El primero tiene 2 EditText: 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 centre en el inicio y que el teclado esté visible . Esta es mi implementación (simplificada eliminando código innecesario/no relacionado).

#app_login.xml

<LinearLayout android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:paddingLeft="20dip"  
    android:paddingRight="20dip">

    <EditText android:id="@+id/username" 
        android:singleLine="true" 
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content" android:hint="Username"  
        android:imeOptions="actionDone" android:inputType="text"
        android:maxLines="1"/>

    <EditText android:id="@+id/password" 
        android:password="true" 
        android:singleLine="true"  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"    
        android:hint="Password" />
</LinearLayout>

#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 urgentemente un teclado allí.

Ahora vamos a la segunda página . Como ya mencioné, tengo listView y EditText allí. Quiero que mi teclado esté oculto al inicio y solo aparezca cuando el usuario toque editText . ¿Puedes creerlo? Todo lo que probé con el teclado virtual se muestra cuando cargo la actividad . No soy capaz de ocultarlo.

#app_list_view.xml

<LinearLayout android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" >
    
   <EditText android:id="@+id/filter_edittext"       
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:hint="Search" android:inputType="text" 
        android:maxLines="1"/>
    <ListView android:id="@id/android:list" 
        android:layout_height="fill_parent"
        android:layout_weight="1.0" 
        android:layout_width="fill_parent" 
        android:focusable="true" 
        android:descendantFocusability="beforeDescendants"/>
</LinearLayout>     

#ListaAplicaciones.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 al inicio.
  2. En SecondPage quiero que el teclado esté oculto primero, para que solo aparezca cuando el usuario toque editarTexto

Y mi problema es que en ambas ocasiones obtengo exactamente lo contrario . Espero que alguien haya enfrentado este problema antes. Por cierto, estoy probando en el simulador y en el teléfono HTC Desire.

#RESULTADO FINAL

Bueno, lo hice funcionar, con la ayuda de todos mis amigos aquí.

1. Para mostrar el teclado al iniciar

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

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);

La segunda respuesta la proporciona @Dyarish. De hecho, se vinculó a otro hilo de SOF, que no había visto antes. Pero lo curioso es que esta solución se da en el hilo al que hice referencia al principio. Y no lo he probado porque no tuvo votos en un hilo donde todas las demás publicaciones tienen muchos votos. El colmo de la tontería.

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

Para mí, la segunda solución parecía buena, así que decidí seguir con ella... Pero la primera ciertamente funciona. Además, la respuesta de @ Dyarish contiene un truco inteligente para usar un ScrollView debajo de EditText para darle el foco a EditText. Pero no lo he probado, pero debería funcionar. Aunque no está bien.

2. Para ocultar el teclado al inicio de la actividad

Solo una respuesta funcionó para mí, proporcionada por @Dyarish. Y la solución es usar la configuración focusableInTouchMode en XML para el diseño que contiene EditTexts. Esto funcionó

<LinearLayout android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:focusableInTouchMode="true">
    <EditText android:id="@+id/filter_edittext"       
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:hint="Search" android:inputType="text" 
        android:maxLines="1"/>
    <ListView android:id="@id/android:list" 
        android:layout_height="fill_parent"
        android:layout_weight="1.0" 
        android:layout_width="fill_parent" 
        android:focusable="true" 
        android:descendantFocusability="beforeDescendants"/>
</LinearLayout> 

De todos modos, termino usando la respuesta de Dyarish en ambos casos. Así que le doy la recompensa. Gracias a todos mis otros amigos que intentaron ayudarme.

Krishnabhadra avatar Jan 01 '70 08:01 Krishnabhadra
Aceptado

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
    }

Me esforcé mucho y encontré una solución... cada vez que se inicia una nueva actividad, el teclado no se puede abrir, pero podemos usar Runnable en onResume y funciona bien, así que pruebe este código y verifique...

ACTUALIZACIÓN 1

agrega esta línea en tuAppLogin.java

mUserNameEdit.requestFocus();

y esta línea en tuAppList.java

listview.requestFocus()'

después de esto verifique su aplicación, si no funciona, agregue esta línea en su AndroidManifest.xmlarchivo

<activity android:name=".AppLogin" android:configChanges="keyboardHidden|orientation"></activity>
<activity android:name=".AppList" android:configChanges="keyboard|orientation"></activity>

RESPUESTA ORIGINAL

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

para ocultar el teclado

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

para mostrar teclado

 imm.showSoftInput(ed, 0);

para centrarse en EditText

 ed.requestFocus();

donde ed es EditarTexto

Niranj Patel avatar Aug 26 '2011 05:08 Niranj Patel

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

es decir: en su archivo app_list_view.xml

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:focusableInTouchMode="true">
    <EditText 
        android:id="@+id/filter_edittext"       
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:hint="Search" 
        android:inputType="text" 
        android:maxLines="1"/>
    <ListView 
        android:id="@id/android:list" 
        android:layout_height="fill_parent"
        android:layout_weight="1.0" 
        android:layout_width="fill_parent" 
        android:focusable="true" 
        android:descendantFocusability="beforeDescendants"/>
</LinearLayout> 

------------------ EDITAR: Para hacer que el teclado aparezca al inicio -----------------------

Esto es para que el teclado aparezca en el cuadro de texto de edición del nombre de usuario al inicio. Todo lo que hice fue agregar una vista de desplazamiento vacía en la parte inferior del archivo .xml, esto enfoca el primer texto de edición y aparece el teclado. Admito que esto es un truco, pero supongo que solo quieres que funcione. Lo he probado y funciona bien.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:paddingLeft="20dip"  
    android:paddingRight="20dip">
    <EditText 
        android:id="@+id/userName" 
        android:singleLine="true" 
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content" 
        android:hint="Username"  
        android:imeOptions="actionDone" 
        android:inputType="text"
        android:maxLines="1"
       />
    <EditText 
        android:id="@+id/password" 
        android:password="true" 
        android:singleLine="true"  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:hint="Password" />
    <ScrollView
        android:id="@+id/ScrollView01"  
        android:layout_height="fill_parent"   
        android:layout_width="fill_parent"> 
    </ScrollView>
</LinearLayout>

Si está buscando una solución más elocuente, encontré esta pregunta que podría ayudarlo; no es tan simple como la solución anterior, pero probablemente sea una mejor solución. No lo he probado pero aparentemente funciona. Creo que es similar a la solución que probaste y que no funcionó para ti.

Espero que esto sea lo que estás buscando.

¡Salud!

Dave avatar Sep 01 '2011 00:09 Dave

Pruebe este código.

Para mostrar el teclado virtual:

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);
    }
Lalit Poptani avatar Aug 26 '2011 05:08 Lalit Poptani