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
- En la página de inicio de sesión (primera página) Quiero que mi teclado sea visible en arranca..
- 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..
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!
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
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);
}
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);
}
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