java - studio - Programar/Ocultar/Mostrar el Teclado de Android
ocultar teclado android in fragment (4)
¿Intentaste InputMethodManager.SHOW_IMPLICIT
en la primera ventana?
y para ocultarlo en la segunda ventana use InputMethodManager.HIDE_IMPLICIT_ONLY
EDITAR:
Si todavía no funciona, entonces probablemente lo estés colocando en el lugar equivocado. Reemplace onFinishInflate()
y muestre / oculte 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);
}
Posible duplicado:
Cerrar / ocultar el teclado suave de Android
Primero lo primero ya vi este hilo. Intenté los métodos aceptados allí ... pero nada me funcionó ...
Tengo dos pantallas en mi aplicación.
- El primero tiene 2 EditText''s: uno para el nombre de usuario y otro para la 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 el teclado debe estar visible. Esta es mi implementación (simplificada al eliminar los 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 un teclado allí ...
Ahora a la segunda página ... Ya dije que tengo listView y EditText allí. Quiero que mi teclado esté oculto en el inicio solo para que aparezca cuando el usuario toca el editText ... ¿Puedes creerlo? todo lo que probé, el teclado suave se muestra cuando carga la actividad ... No puedo 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);
}
}
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 se oculte primero, solo que aparezca cuando el usuario toca editText
Y mi problema es que estoy obteniendo exactamente lo contrario en ambas ocasiones ... Espero que alguien haya enfrentado este problema antes ... 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 en el 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);
La segunda respuesta es proporcionada por @Dyarish. De hecho, él 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 un montón de votos ... Altura de tonterías ...
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Para mí, la segunda solución se veía limpia, así que decidí seguir con ella ... Pero la primera ciertamente funciona. Además, 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 intentado, pero debería funcionar. Aunque no limpio ...
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 focusableInTouchMode en xml para el diseño que contiene los 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 acabo usando la respuesta de Dyarish en ambos casos. Así que le estoy otorgando la recompensa. Gracias a todos los otros amigos que intentaron 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 edición de texto. Desea agregar esta línea a su diseño lineal que contiene el EditTextBox. Debes 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>
------------------ EDIT: Para hacer que el teclado aparezca en el inicio -----------------------
Esto es para hacer que el teclado aparezca en el nombre de usuario edittextbox en el inicio. Todo lo que he hecho es agregar una vista de desplazamiento vacía en la parte inferior del archivo .xml, esto pone el primer texto de edición en foco y abre 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 this pregunta que podría ayudarle, 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 te funcionó.
Espero que esto sea lo que buscas.
¡Aclamaciones!
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);
}
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 comienza una nueva actividad, el teclado no se puede abrir, pero podemos usar Runnable en onResume y está funcionando bien, así que intente este código y verifique ...
ACTUALIZACIÓN 1
añade esta linea en tu AppLogin.java
mUserNameEdit.requestFocus();
y esta linea en tu AppList.java
listview.requestFocus()''
después de esto, verifique su aplicación si no está funcionando, luego agregue esta línea en su archivo AndroidManifest.xml
<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 teclado
imm.hideSoftInputFromWindow(ed.getWindowToken(), 0);
para mostrar el teclado
imm.showSoftInput(ed, 0);
para centrarse en EditText
ed.requestFocus();
donde ed es EditText