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?

Galip
fuente
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.

Vikas Patidar
fuente
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"
UKDataGeek
fuente
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.

Jorgesys
fuente
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í :)

Sid
fuente
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

Brent Young
fuente
4

Use esto en el código de su actividad:

@Override
public void onCreate(Bundle savedInstanceState) {

getWindow().setSoftInputMode(
   WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

}
Bobs
fuente
Esto no funcionó para mí, el teclado aún aparecía cuando comienzo mi actividad.
David Doria
Puede consultar este enlace, funcionará: stackoverflow.com/questions/18977187/…
Sujeet Kumar Gupta
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.

Zekitez
fuente
3
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);
Sreelal S
fuente
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.

Salman Nazir
fuente
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;
                }});
Paul Roosens
fuente
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.

Steve Waring
fuente
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.

NP Kaushik
fuente
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.

Mtl Dev
fuente
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 :)

Yogesh Rathi
fuente
La pregunta era cómo evitar que se abriera el teclado.
jk7
0

android: windowSoftInputMode = "stateHidden | adjustResize"

Funcionando bien

Softlabsindia
fuente
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"/>
Aabauser
fuente
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

Sheraz Ahmad Khilji
fuente
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

Mayuresh Pachangane
fuente
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.

Pritesh Shah
fuente
Hice esto, pero el teclado todavía aparece y el foco está en editText.
David Doria