Tengo una pregunta relativamente simple. Tengo una actividad con muchos EditText en ellos. Cuando abro la actividad, se enfoca automáticamente en el primer EditText y muestra el teclado virtual.
¿Cómo puedo prevenir esto?
Tengo una pregunta relativamente simple. Tengo una actividad con muchos EditText en ellos. Cuando abro la actividad, se enfoca automáticamente en el primer EditText y muestra el teclado virtual.
¿Cómo puedo prevenir esto?
Respuestas:
Utilice estos atributos en su etiqueta de diseño en un archivo XML:
android:focusable="true"
android:focusableInTouchMode="true"
Como informaron otros miembros en los comentarios, no funciona, por ScrollView
lo que debe agregar estos atributos al hijo principal de ScrollView
.
Puede agregar esto a su actividad de manifiesto de Android:
android:windowSoftInputMode="stateHidden|adjustResize"
android:windowSoftInputMode="stateHidden|adjustPan"
Tengo varias implementaciones descritas aquí, pero ahora las he agregado a AndroidManifest.xml
mi Activity
propiedad:
android:windowSoftInputMode="stateAlwaysHidden"
fragments
." stateAlwaysHidden " El teclado virtual siempre está oculto cuando la ventana principal de la actividad tiene el foco de entrada.
https://stackoverflow.com/a/11627976/5217837 Esto es casi correcto:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
Pero debería ser SOFT_INPUT_STATE_HIDDEN en lugar de SOFT_INPUT_STATE_ALWAYS_VISIBLE
Use esto en el código de su actividad:
@Override
public void onCreate(Bundle savedInstanceState) {
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
Tuve un problema similar, incluso cuando cambiaba de pestaña, el teclado aparecía automáticamente y permanecía así, con Android 3.2.1 en una tableta. Utilice el siguiente método:
public void setEditTextFocus(EditText searchEditText, boolean isFocused)
{
searchEditText.setCursorVisible(isFocused);
searchEditText.setFocusable(isFocused);
searchEditText.setFocusableInTouchMode(isFocused);
if (isFocused) {
searchEditText.requestFocus();
} else {
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS );
}
}
En onCreate () y en onPause () de la actividad para cada EditText:
setEditTextFocus (myEditText, falso);
Para cada EditText un OnTouchListener:
myEditText.setOnTouchListener(new EditText.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
setEditTextFocus(myEditText, true);
return false;
}
});
Para cada uno EditText
en el OnEditorActionListener
:
myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
.......
setEditTextFocus(myEditText, false);
return false;
}
});
Y para cada uno EditText
en el layout xml
:
android:imeOptions="actionDone"
android:inputType="numberDecimal|numberSigned" // Or something else
Probablemente haya más optimización de código posible.
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);
Encontré esta solución simple que funcionó para mí Establezca estos atributos en su diseño principal:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >
Y ahora, cuando la actividad comience, este diseño principal se centrará de forma predeterminada.
Además, podemos quitar el foco de las vistas secundarias en tiempo de ejecución volviendo a centrarse en el diseño principal, así:
findViewById(R.id.mainLayout).requestFocus();
Espero que funcione para ti.
esta es la solución que estoy usando, no es la mejor solución pero me está funcionando bien
editComment.setFocusableInTouchMode(false);
editComment.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event)
{
// TODO Auto-generated method stub
editComment.setFocusableInTouchMode(true);
editComment.requestFocus() ;
return false;
}});
Curiosamente, esta documentación https://developer.android.com/training/keyboard-input/visibility.html establece que cuando se inicia una actividad y se enfoca un campo de texto, el teclado virtual no se muestra (y luego pasa a mostrarle cómo mostrar el teclado si lo desea con algún código).
En mi Samsung Galaxy S5, así es como funciona mi aplicación (sin entrada de manifiesto o código específico), sin teclado virtual. Sin embargo, en un Lollipop AVD, se muestra un teclado virtual, lo que contraviene el documento proporcionado anteriormente.
Si obtiene este comportamiento al probar en un AVD, es posible que desee probar en un dispositivo real para ver qué sucede.
Esto tiene algunas buenas respuestas en la siguiente publicación: Evite que EditText se enfoque en el inicio de la actividad . El que uso habitualmente es el siguiente código de Morgan :
<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px"/>
<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:nextFocusUp="@id/autotext"
android:nextFocusLeft="@id/autotext"/>
NOTA: El elemento ficticio debe COLOCARSE JUSTO ANTES del elemento enfocable.
Y creo que debería funcionar perfectamente incluso con ScrollView y tampoco he tenido problemas de accesibilidad para esto.
Esto ocurre cuando su EditText obtiene Focus automáticamente cuando comienza su actividad. Entonces, una forma fácil y estable de solucionar este problema es simplemente establecer el enfoque inicial en cualquier otra vista, como un botón, etc.
Puede hacer esto en su diseño XML, no se requiere código.
La respuesta aceptada no me funciona, es por eso que dar una solución de trabajo de respuesta, ¡puede ser útil!
EditText edt = (EditText) findViewById(R.id.edt);
edt.requestFocus();
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
edt.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
Ahora el teclado está abierto, disfruta :)
android: windowSoftInputMode = "stateHidden | adjustResize"
Funcionando bien
android:focusableInTouchMode="true"
Agregue la línea anterior a xml de EditText
o TextInputLayout
que tiene el foco y está haciendo softInputKeyboard
que aparezca.
Esto nos resolvió el problema y ahora el teclado no aparece
search_edit_text = (EditText) findViewById (R.id.search_edit_text);
search_edit_text.requestFocus();
search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
Esto funciona para mí, chicos, el fragmento puede tener una sintaxis diferente. ESTO FUNCIONA PARA LA ACTIVIDAD
Si su vista tiene EditText y Listview, el teclado se abrirá de forma predeterminada. Para evitar que el teclado aparezca de forma predeterminada, haga lo siguiente
this.listView.requestFocus();
Asegúrese de que solicita el enfoque en la vista de lista después de obtener la vista de editText.
Por ejemplo
this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();
Si lo hace, editText se enfocará y aparecerá el teclado.