Ocultar/Mostrar mediante programación el Teclado de Software de Android [duplicar]


Posible Duplicado:
Cerrar / ocultar el teclado de software de Android

Lo primero primero ya vi este hilo. Probé métodos aceptados 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 nombre de usuario EditText para tener foco en el inicio y el teclado debe ser visible ..Esta es mi implementación (simplificada eliminando códigos innecesarios / no relacionados)..

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

Ahora a segunda página..Ya he dicho que tengo un ListView y EditText allí.. Quiero que mi teclado esté oculto al iniciar solo aparecerá cuando el usuario toque EditText ..¿Puedes creerlo? lo que he intentado Teclado de software se muestra cuando carga 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>     

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

Para simplificar

  1. En la página de inicio de sesión (primera página) Quiero que mi teclado sea visible en arranca..
  2. En la segunda página quiero que el teclado se oculte primero, solo para aparecer cuando el usuario toca EditText

Y mi problema es que estoy recibiendo exactamente lo contrario en ambas ocasiones...Espero que alguien haya enfrentado este problema antes..Por cierto, estoy probando en el simulador y 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 es 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);

Segundo respuestas es proporcionada por @ Dyarish, De hecho, se vinculó a otro hilo de SO, que no he visto antes. Pero lo curioso es que, esta solución se da en el hilo que hice referencia al inicio. Y no lo he intentado salió porque tenía cero votos en un hilo donde todos los demás puestos tienen un montón de votos..El colmo de la estupidez..

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

Para mí la segunda solución parecía ordenada, así que decidí seguir con ella..Pero el primero funciona. También la respuesta de @Dyarish contiene un truco inteligente de usar un ScrollView debajo de EditText para darle a EditText el enfoque..Pero no lo he probado, pero debería funcionar. Sin embargo, no es genial..

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 utilizar focusableInTouchMode configuración en xml para el diseño que contiene el EditText. Esto hizo el truco

<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 estoy otorgando la recompensa a él..Gracias a todos los demás amigos que trató de ayudarme..

Author: Cœur, 2011-08-26

4 answers

Al agregar esto a su código android:focusableInTouchMode="true" se asegurará de que su teclado no aparezca en el inicio para su cuadro edittext. Desea agregar esta línea a su diseño lineal que contiene el EditTextBox. Usted debe ser capaz de jugar con esto, para solucionar sus problemas. He probado esto. Solución Simple.

Ie: En tu app_list_view.archivo 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> 

------------------ EDIT: Para que el teclado aparezca en el inicio -----------------------

Esto es para hacer que Teclado aparece en el nombre de usuario edittextbox en el inicio. Todo lo que he hecho es añadir un Scrollview vacío a la parte inferior de la .archivo xml, esto pone el primer edittext en foco y aparece el teclado. Admito que esto es un truco, pero asumo que solo quieres que esto 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, he encontrado esta pregunta que podría ayudarlo, no es tan simple como la solución anterior, pero probablemente una mejor solución. No lo he probado, pero al parecer funciona. Creo que es similar a la solución que ha intentado que no funcionó para usted, aunque.

Espero que esto sea lo que estás buscando.

Salud!

 124
Author: Dave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:11

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 puede abrirse, pero podemos usar Runnableen onResume y está funcionando bien, así que pruebe este código y verifique...

ACTUALIZACIÓN 1

Agregue esta línea en su AppLogin.java

mUserNameEdit.requestFocus();

Y esta línea en su AppList.java

listview.requestFocus()'

Después de esto, verifique su aplicación si no está funcionando, agregue esta línea en su AndroidManifest.xml file

<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 el teclado

 imm.showSoftInput(ed, 0);

Para centrarse en EditText

 ed.requestFocus();

Donde ed es EditText

 158
Author: Niranj Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-10 10:33:00

Pruebe 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);
    }
 52
Author: Lalit Poptani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-04 22:20:06

Probaste InputMethodManager.SHOW_IMPLICIT en la primera ventana.

Y para ocultarse en la segunda ventana use InputMethodManager.HIDE_IMPLICIT_ONLY

EDITAR:

Si todavía no funciona, entonces probablemente lo está poniendo en el lugar equivocado. Override 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);
}
 8
Author: Ronnie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-30 04:29:12