android tipos tapa - Evita que EditText se enfoque en el inicio de la actividad




15 Answers

Excelentes respuestas de Luc y Mark, sin embargo, falta una buena muestra de código. Agregar la etiqueta android:focusableInTouchMode="true" a <LinearLayout> 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"/>
caja salga

Tengo una Activity en Android, con dos elementos:

  1. EditText
  2. ListView

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

EditText.setSelected(false);

Sin suerte. ¿Cómo puedo convencer a EditText para que no se seleccione cuando comience la Activity ?




Existe una solución más simple. Establezca estos atributos en su diseño padre:

<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á por defecto.

Además, podemos eliminar el enfoque de las vistas secundarias en el tiempo de ejecución (p. Ej., Después de finalizar la edición secundaria) volviendo a centrar la atención en el diseño principal, así:

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

Buen comentario de Guillaume Perrot :

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

En realidad, podemos ver que los beforeDescendants establecidos como predeterminados en el método ViewGroup.initViewGroup() (Android 2.2.2). Pero no es igual a 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Gracias a Guillaume.




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

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

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



Lo siguiente evitará que el texto de edición se centre cuando se crea, pero tómelo 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 el java, que agrega la siguiente escucha:

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 está consumiendo el evento, el comportamiento de enfoque procederá de manera normal.




Intenté varias respuestas individualmente, pero el enfoque sigue en el 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://.com/a/8639921/15695 )

y quitar

 <requestFocus />

en EditText

(Referencia de floydaddict share )




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

android:windowSoftInputMode="stateAlwaysHidden"



Lo siguiente me funcionó en Manifest . Escribir ,

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



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

Source




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

ListView.requestFocus(); 

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

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




Agregue lo siguiente en el método onCreate :

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



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



Escribe esta línea en el diseño de tus padres ...

 android:focusableInTouchMode="true"



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

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



Escriba este código dentro del archivo Manifest en la Activity en la que 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>



En onCreate de su actividad, solo agregue use clearFocus() en su elemento EditText. Por ejemplo,

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

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

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



Related