Teclado emergente automático al iniciar la actividad


97

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?


Verifique mi respuesta a esta pregunta stackoverflow.com/questions/39593324/…
Ayuda de Android

Cuando se inicia Mi aplicación (abierta) y si la vista de edición de texto está disponible, el teclado está habilitado en Automático (mostrar). Cómo solucionar este problema haga clic aquí easycomacademy.com/…
AhmadUllah Ahmad

Respuestas:


209

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 ScrollViewlo que debe agregar estos atributos al hijo principal de ScrollView.


3
Esto también solucionó mi problema. Agregué esto a la etiqueta RelativeLayout para mi actividad. ¡Gracias!
Luke

21
Curiosamente, no funcionó cuando agregué lo anterior a un ScrollView, pero funcionó para un LinearLayout
Jerry Brady

1
Creo que tienes que ponerlo en el diseño superior
Utsav Gupta

Entonces, supongo que esto funciona porque le estás diciendo al diseño en sí que puede tener foco. De lo contrario, ¿asume que debe centrarse en el primer control del formulario? Por extraño que parezca, estaba obteniendo el teclado incluso si todos los controles de mi formulario estaban desactivados. Arreglado ahora. ¡Gracias!
crowmagnumb

1
Es importante tener en cuenta que esta solución crea problemas de accesibilidad (una vista que no debería ser enfocada al estar marcada como con enfoque) y podría tener consecuencias no deseadas.
Renato

96

Puede agregar esto a su actividad de manifiesto de Android:

android:windowSoftInputMode="stateHidden|adjustResize"

Esto funciona, sin embargo, si tiene un fondo de imagen y le preocupa que su teclado android:windowSoftInputMode="stateHidden|adjustPan"
virtual reduzca

31

Tengo varias implementaciones descritas aquí, pero ahora las he agregado a AndroidManifest.xmlmi Activitypropiedad:

android:windowSoftInputMode="stateAlwaysHidden"

Creo que esta es la forma fácil incluso si está utilizando fragments.

" stateAlwaysHidden " El teclado virtual siempre está oculto cuando la ventana principal de la actividad tiene el foco de entrada.


esto funcionó para mí con ScrollView y RelativeLayout.
iversoncru

No es tan bueno para los fragmentos, ya que está asociando el "estado oculto" con la actividad que contendrá todos sus fragmentos, lo que significa que cualquier fragmento que desee mostrar en la actividad se verá afectado por la propiedad (no en un "por fragmento "base).
Pelpotronic

11

Si tiene otra vista de su actividad como ListView, también puede hacer:

ListView.requestFocus(); 

en su onResume () para tomar el foco del editText.

Sé que esta pregunta ha sido respondida, pero solo proporciono una solución alternativa que funcionó para mí :)


5

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



3

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 EditTexten 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 EditTexten el layout xml:

            android:imeOptions="actionDone"
            android:inputType="numberDecimal|numberSigned" // Or something else

Probablemente haya más optimización de código posible.


3
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);

usando el fragmento ... este código funciona para ocultar el teclado ... cuando un fragmento se abre, evite el enfoque en el teclado del campo de texto de edición ...
Sreelal S

2

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.


1

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

1

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.


1

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.


0

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.


0

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 :)


La pregunta era cómo evitar que se abriera el teclado.
jk7

0

android: windowSoftInputMode = "stateHidden | adjustResize"

Funcionando bien


0

Agregue el siguiente código a la parte superior del XML de la actividad y asegúrese de que la Vista esté por encima de EditText

<View 
android:layout_width="0dp"
android:layout_height="0dp"
android:focusableInTouchMode="true"/>

0

android:focusableInTouchMode="true"

Agregue la línea anterior a xml de EditTexto TextInputLayoutque tiene el foco y está haciendo softInputKeyboardque aparezca.

Esto nos resolvió el problema y ahora el teclado no aparece


0

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


Debe proporcionar cualquier limitación, suposición o simplificación en su respuesta. Vea más detalles sobre cómo responder en este enlace: stackoverflow.com/help/how-to-answer
Usama Abdulrehman

-1

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.


Hice esto, pero el teclado todavía aparece y el foco está en editText.
David Doria
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.