Android: ocultar/mostrar mediante programación el teclado virtual [duplicado]
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
- En la página de inicio de sesión (primera página), quiero que mi teclado esté visible al inicio.
- 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.
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.xml
archivo
<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
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!
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);
}