Cómo evitar que EditText se enfoque en el inicio de la actividad en Android

Tengo una Activity en Android, con dos elementos:

  1. EditText
  2. ListView

Cuando mi Activity comienza, el EditText inmediatamente tiene el foco de entrada (cursor parpadeante). No quiero que ningún control tenga foco de entrada al inicio. Lo intenté:

EditText.setSelected(false);
EditText.setFocusable(false);

Sin suerte. ¿Cómo puedo convencer al EditText para no seleccionarse a sí mismo cuando el Activity ¿empieza?

preguntado Oct 12 '09, 12:10

30 Respuestas

Excelentes respuestas de Luc y Mark, sin embargo, falta una buena muestra de código. Agregar la etiqueta android:focusableInTouchMode="true" e android:focusable="true" al diseño principal (p. ej. LinearLayout or ConstraintLayout) como el siguiente ejemplo solucionará el problema.

<!-- 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"/>

Respondido 20 Abr '20, 08:04

¿Qué hay de configurar el con el futuro bebé diseño para android:focusableInTouchMode="true"! - muhammad babar

¿El problema real es que simplemente no quieres que se enfoque en absoluto? O no quiere que muestre el teclado virtual como resultado de enfocar el EditText? Realmente no veo un problema con el EditText tener el foco en el inicio, pero definitivamente es un problema tener la ventana softInput abierta cuando el usuario no solicitó explícitamente enfocarse en el EditText (y abre el teclado como resultado).

Si es el problema del teclado virtual, consulte el AndroidManifest.xml elemento documentación.

android:windowSoftInputMode="stateHidden" - Ocultarlo siempre al entrar en la actividad.

or android:windowSoftInputMode="stateUnchanged" - no lo cambie (por ejemplo, no Mostrar si aún no se muestra, pero si estaba abierto al ingresar a la actividad, déjelo abierto).

Respondido 11 ago 17, 18:08

sin embargo, el cursor todavía está en el primer EditText en el diseño, aunque no se muestra el teclado, martyglaubitz

@Anderson: Nada en la respuesta implicaba que evitaría la EditText de obtener el enfoque. De hecho, establece claramente que así es como se previene la teclado de software IME de abrirse automáticamente en foco; porque es más probable que la mayor preocupación sea que el teclado virtual aparezca inesperadamente, no el enfoque en sí. Si su problema es con el EditText realmente tener el enfoque en absoluto, luego use la respuesta de otra persona - Joe

Existe una solución más sencilla. 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 enfocará de forma predeterminada.

Además, podemos quitar el foco de las vistas secundarias en tiempo de ejecución (por ejemplo, después de terminar la edición secundaria) dando el foco al diseño principal nuevamente, así:

findViewById(R.id.mainLayout).requestFocus();

Buen comentario del Guillermo Perrot:

android:descendantFocusability="beforeDescendants" parece ser el predeterminado (el valor entero es 0). Funciona con solo agregar android:focusableInTouchMode="true".

Realmente, podemos ver que el beforeDescendants establecido como predeterminado en el ViewGroup.initViewGroup() método (Android 2.2.2). Pero no igual a 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Gracias a Guillaume.

Respondido el 20 de enero de 20 a las 06:01

La única solución que encontré es:

  • Créar un diseño lineal (No sé si funcionarán otros tipos de diseños)
  • Establecer los atributos android:focusable="true" e android:focusableInTouchMode="true"

En los EditText no se enfocará después de comenzar la actividad

Respondido 18 Feb 21, 14:02

El problema parece provenir de una propiedad que solo puedo ver en el XML form del diseño.

Asegúrese de eliminar esta línea al final de la declaración dentro del EditText Etiquetas XML:

<requestFocus />

Eso debería dar algo así:

<EditText
   android:id="@+id/emailField"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:inputType="textEmailAddress">

   //<requestFocus /> /* <-- without this line */
</EditText>

Respondido 21 Oct 17, 22:10

Utilizando la información proporcionada por otros carteles, utilicé la siguiente solución:

en el XML de diseño

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:id="@+id/linearLayout_focus"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:layout_width="0px"
    android:layout_height="0px"/>

<!-- AUTOCOMPLETE -->
<AutoCompleteTextView
    android:id="@+id/autocomplete"
    android:layout_width="200dip"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dip"
    android:inputType="textNoSuggestions|textVisiblePassword"/>

en onCreate ()

private AutoCompleteTextView mAutoCompleteTextView;
private LinearLayout mLinearLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mylayout);

    //get references to UI components
    mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
    mLinearLayout = (LinearLayout) findViewById(R.id.linearLayout_focus);
}

y finalmente, en onResume ()

@Override
protected void onResume() {
    super.onResume();

    //do not give the editbox focus automatically when activity starts
    mAutoCompleteTextView.clearFocus();
    mLinearLayout.requestFocus();
}

Respondido 24 Abr '15, 23:04

Intente clearFocus () en lugar de setSelected(false). Cada vista en Android tiene tanto capacidad de enfoque como de selección, y creo que solo desea aclarar el enfoque.

Respondido 22 Oct 17, 06:10

Eso suena prometedor, pero ¿en qué punto del ciclo de vida de la actividad debería llamarse? Si lo llamo en onCreate (), EditText todavía tiene el foco. ¿Debería llamarse en onResume () o en alguna otra ubicación? ¡Gracias! - Marc

Combiné la respuesta aceptada con esta respuesta. llame myEditText.clearFocus(); myDummyLinearLayout.requestFocus(); en el capítulo respecto a la onResume de la Actividad. Esto aseguró que EditText no mantuviera el enfoque cuando se giraba el teléfono. - teedyay

Lo siguiente evitará que el texto de edición se enfoque cuando se crea, pero agárrelo cuando lo toque.

<EditText
    android:id="@+id/et_bonus_custom"
    android:focusable="false" />

Por lo tanto, establece focusable en falso en el xml, pero la clave está en java, al que agrega el siguiente oyente:

etBonus.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.setFocusable(true);
        v.setFocusableInTouchMode(true);
        return false;
    }
});

Debido a que está devolviendo falso, es decir, no consumiendo el evento, el comportamiento de enfoque procederá normalmente.

Respondido 24 Abr '15, 22:04

Pero esto nunca se enfocará en el futuro, ¿cómo detener el enfoque solo para el inicio inicial (inicio de actividad)? - Jayesh

El onTouchListener se llama antes que otras acciones táctiles. Por lo tanto, al habilitar el enfoque táctil, el enfoque estándar ocurre en el primer toque. Aparecerá el teclado y todo. - hombre picado

Probé varias respuestas individualmente, pero el enfoque todavía está en EditText. Solo logré resolverlo usando dos de las siguientes soluciones juntas.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/mainLayout"
  android:descendantFocusability="beforeDescendants"
  android:focusableInTouchMode="true" >

(Referencia de Silver https://stackoverflow.com/a/8639921/15695 )

y quitar

 <requestFocus />

en EditText

(Referencia de floydaddict https://stackoverflow.com/a/9681809 )

Respondido 10 Oct 18, 06:10

Tuve que agregar edittext.clearFocus () además de lo anterior para que funcione :) - Nav

Respuesta tardía pero más simple, solo agregue esto en el diseño principal del XML.

android:focusable="true" 
android:focusableInTouchMode="true"

¡Vota si te ayudó! Codificación feliz :)

contestado el 16 de mayo de 19 a las 10:05

funcionó perfectamente para mí. una cosa más a tener en cuenta es que no agregue estas líneas a la vista de desplazamiento. No funcionará en la vista de desplazamiento. Pero funcionó perfectamente con diseño lineal. - Srinivasan kártico

Ninguna de estas soluciones funcionó para mí. La forma en que arreglo el enfoque automático fue:

<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</activity>

respondido 30 nov., 11:16

android: windowSoftInputMode = "adjustPan" en cualquier actividad en el manifiesto de Android - Rallat

Solución simple: en AndroidManifest in Activity uso de etiquetas

android:windowSoftInputMode="stateAlwaysHidden"

Respondido el 27 de Septiembre de 16 a las 11:09

Estrictamente hablando, esto no resuelve el problema. el OP dijo: "No quiero que ningún control tenga el foco de entrada al inicio". Su solución solo oculta el teclado, hay una diferencia sutil. - Katzenhut

@katzenhut sí, ese es mi problema con esta respuesta exactamente. Centrarse en mi texto de edición abre una actividad PlaceAutoComplete, por lo que esta respuesta está incompleta: Zach

Esta respuesta estaría completa si la pregunta fuera: ¿Cómo me aseguro siempre de que mi actividad nunca muestre un teclado? Lo cual no es. - Martín Marconcini

Puedes simplemente configurar "enfocable" e "enfocable en modo táctil" para valorar verdadero en el primero TextView de la layout. De esta forma cuando la actividad comienza el TextView estará enfocado pero, por su naturaleza, no verá nada enfocado en la pantalla y, por supuesto, habrá no teclado mostrado ...

Respondido el 27 de Septiembre de 13 a las 19:09

Lo siguiente funcionó para mí en Manifest. Escribir ,

<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>

Respondido el 27 de Septiembre de 16 a las 11:09

Esto no desenfoca el campo de texto: simplemente oculta el teclado. Aún obtendrá una pista que se ha eliminado del campo, y cualquier selector de estado de color mostrará el estado "enfocado = verdadero". - A. rabioso

Necesitaba despejar el enfoque de todos los campos mediante programación. Acabo de agregar las siguientes dos declaraciones a mi definición de diseño principal.

myLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
myLayout.setFocusableInTouchMode(true);

Eso es. Arreglado mi problema al instante. Gracias, Silver, por indicarme la dirección correcta.

Respondido el 28 de Septiembre de 12 a las 00:09

Añada android:windowSoftInputMode="stateAlwaysHidden" en la etiqueta de actividad del Manifest.xml archivo.

Fuente

Respondido el 27 de Septiembre de 16 a las 11:09

Esto no desenfoca el campo de texto: simplemente oculta el teclado. Aún obtendrá una pista que se ha eliminado del campo, y cualquier selector de estado de color mostrará el estado "enfocado = verdadero". - A. rabioso

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

ListView.requestFocus(); 

en tu onResume() para captar el foco de la editText.

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

Respondido el 27 de Septiembre de 13 a las 19:09

Pruebe esto antes de su primer campo editable:

<TextView  
        android:id="@+id/dummyfocus" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:text="@string/foo"
        />

----

findViewById(R.id.dummyfocus).setFocusableInTouchMode(true);
findViewById(R.id.dummyfocus).requestFocus();

Respondido el 12 de junio de 11 a las 01:06

Agregar siguientes en onCreate método:

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Respondido el 27 de Septiembre de 16 a las 11:09

Esto no desenfoca el campo de texto: simplemente oculta el teclado. Aún obtendrá una pista que se ha eliminado del campo, y cualquier selector de estado de color mostrará el estado "enfocado = verdadero". - A. rabioso

Dado que no me gusta contaminar el XML con algo relacionado con la funcionalidad, creé este método que "de forma transparente" roba el foco de la primera vista enfocable y luego se asegura de eliminarse cuando sea necesario.

public static View preventInitialFocus(final Activity activity)
{
    final ViewGroup content = (ViewGroup)activity.findViewById(android.R.id.content);
    final View root = content.getChildAt(0);
    if (root == null) return null;
    final View focusDummy = new View(activity);
    final View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View view, boolean b)
        {
            view.setOnFocusChangeListener(null);
            content.removeView(focusDummy);
        }
    };
    focusDummy.setFocusable(true);
    focusDummy.setFocusableInTouchMode(true);
    content.addView(focusDummy, 0, new LinearLayout.LayoutParams(0, 0));
    if (root instanceof ViewGroup)
    {
        final ViewGroup _root = (ViewGroup)root;
        for (int i = 1, children = _root.getChildCount(); i < children; i++)
        {
            final View child = _root.getChildAt(i);
            if (child.isFocusable() || child.isFocusableInTouchMode())
            {
                child.setOnFocusChangeListener(onFocusChangeListener);
                break;
            }
        }
    }
    else if (root.isFocusable() || root.isFocusableInTouchMode())
        root.setOnFocusChangeListener(onFocusChangeListener);

    return focusDummy;
}

Respondido 24 Abr '13, 14:04

Escriba esta línea en su Diseño para padres ...

 android:focusableInTouchMode="true"

Respondido 26 Jul 17, 10:07

respuesta duplicada - Ricardo A.

Tarde, pero quizás útil. Cree un EditText ficticio en la parte superior de su diseño y luego llame myDummyEditText.requestFocus() in onCreate()

<EditText android:id="@+id/dummyEditTextFocus" 
android:layout_width="0px"
android:layout_height="0px" />

Eso parece comportarse como esperaba. No es necesario manejar cambios de configuración, etc. Necesitaba esto para una actividad con un TextView extenso (instrucciones).

Respondido 13 Feb 11, 01:02

¿Por qué no hacer esto con la vista raíz? - CJBS

Sí, hice lo mismo: creé un diseño lineal 'ficticio' que obtiene el enfoque inicial. Además, configuré las ID de enfoque 'siguiente' para que el usuario no pueda enfocarlo más después de desplazarse una vez:

<LinearLayout 'dummy'>
<EditText et>

dummy.setNextFocusDownId(et.getId());

dummy.setNextFocusUpId(et.getId());

et.setNextFocusUpId(et.getId());

mucho trabajo solo para deshacerse del enfoque en una vista ..

Muchas Gracias

Respondido el 27 de Septiembre de 13 a las 19:09

Para mí, lo que funcionó en todos los dispositivos es esto:

    <!-- fake first focusable view, to allow stealing the focus to itself when clearing the focus from others -->

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

Simplemente coloque esto como una vista antes de la vista enfocada problemática, y eso es todo.

contestado el 14 de mayo de 14 a las 09:05

<TextView
    android:id="@+id/TextView01"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"
    android:focusable="true"
    android:focusableInTouchMode="true"
    style="@android:style/Widget.EditText"/>

respondido 31 mar '17, 19:03

Lo más simple que hice fue poner el foco en otra vista en onCreate:

    myView.setFocusableInTouchMode(true);
    myView.requestFocus();

Esto detuvo la aparición del teclado en pantalla y no había ningún cursor parpadeando en EditText.

Respondido el 03 de enero de 13 a las 06:01

Esta es la solución perfecta y más fácil. Siempre la uso en mi aplicación.

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

respondido 31 mar '15, 10:03

Esto no desenfoca el campo de texto: simplemente oculta el teclado. Aún obtendrá una pista que se ha eliminado del campo, y cualquier selector de estado de color mostrará el estado "enfocado = verdadero". - A. rabioso

Escribe este código dentro Manifest presentar en el Activity donde no desea abrir el teclado.

android:windowSoftInputMode="stateHidden"

Archivo de manifiesto:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.projectt"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="24" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
         <activity
            android:name=".Splash"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Login"
            **android:windowSoftInputMode="stateHidden"**
            android:label="@string/app_name" >
        </activity>

    </application>

</manifest>

respondido 15 mar '17, 07:03

Esto no desenfoca el campo de texto: simplemente oculta el teclado. Aún obtendrá una pista que se ha eliminado del campo, y cualquier selector de estado de color mostrará el estado "enfocado = verdadero". - A. rabioso

At onCreate de su actividad, solo agregue el uso clearFocus() en su elemento EditText. Por ejemplo,

edittext = (EditText) findViewById(R.id.edittext);
edittext.clearFocus();

Y si desea desviar el foco a otro elemento, use requestFocus() en ese. Por ejemplo,

button = (Button) findViewById(R.id.button);
button.requestFocus();

contestado el 23 de mayo de 13 a las 11:05

La forma más fácil de ocultar el teclado es usar setSoftInputMode

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

o puede usar InputMethodManager y ocultar el teclado como este.

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

Respondido el 11 de Septiembre de 17 a las 11:09

la pregunta no es sobre el teclado - Ricardo A.

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.