Detener EditText para que no se centre en el inicio de la actividad

Tengo una Activity en Android, con dos elementos:

  1. EditText
  2. ListView

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

 EditText.setSelected(false); 

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

Excelentes respuestas de Luc y Mark, sin embargo, falta una buena muestra de código. Agregar la etiqueta android:focusableInTouchMode="true" a como en el siguiente ejemplo solucionará el problema.

     

¿Es el problema real que simplemente no desea que tenga foco en absoluto? ¿O no quieres que muestre el teclado virtual como resultado de enfocar EditText ? Realmente no veo un problema con EditText tenga foco en el inicio, pero definitivamente es un problema tener la ventana de SoftInput abierta cuando el usuario no solicitó explícitamente centrarse en EditText (y abrir el teclado como resultado).

Si se trata del problema del teclado virtual, consulte la documentación del elemento AndroidManifest.xml .

android:windowSoftInputMode="stateHidden" – siempre android:windowSoftInputMode="stateHidden" al ingresar la actividad.

o android:windowSoftInputMode="stateUnchanged" – no lo cambie (p. ej., no lo muestre si aún no se muestra, pero si estaba abierto al ingresar la actividad, déjelo abierto).

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

  

Y ahora, cuando la actividad comience, este diseño principal se enfocará por defecto.

Además, podemos eliminar el enfoque de vistas secundarias en el tiempo de ejecución (por ejemplo, después de terminar la edición infantil) volviendo a centrar el diseño principal, como este:

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

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

Gracias a Guillaume.

La única solución que he encontrado es:

  • Crea un LinearLayout (no sé si funcionarán otros tipos de Layouts )
  • Establezca los atributos android:focusable="true" y android:focusableInTouchMode="true"

Y EditText no obtendrá el foco después de comenzar la actividad

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 statement dentro de las tags XML de EditText :

  

Eso debería dar algo como eso:

  // /* < -- without this line */  

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

en el diseño XML

     

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

Lo siguiente evitará que el texto de edición tome enfoque cuando se cree, pero tómelo cuando lo toque.

  

Por lo tanto, configura focalizable en falso en el xml, pero la clave está en el 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; } }); 

Como devuelve falsa, es decir, no consume el evento, el comportamiento de enfoque continuará de forma normal.

Pruebe clearFocus () en lugar de setSelected(false) . Todas las vistas en Android tienen tanto capacidad de enfoque como de selección, y creo que quieres simplemente despejar el foco.

Probé la respuesta serval de forma individual, pero el foco sigue estando en EditText. Solo logro resolverlo usando dos de las soluciones anteriores juntas.

  

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

y eliminar

   

en EditText

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

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

     

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

 android:windowSoftInputMode="stateAlwaysHidden" 

Puede configurar “enfocable” y “enfocable en modo táctil” para establecer el valor verdadero en el primer TextView del layout . De esta forma, cuando comience la actividad, TextView se enfocará pero, debido a su naturaleza, no verá nada enfocado en la pantalla y, por supuesto, no se mostrará el teclado …

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

  

Necesitaba borrar el foco de todos los campos programáticamente. Acabo de agregar las dos afirmaciones siguientes a la definición de mi diseño principal.

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

Eso es. Solucionado mi problema al instante. Gracias, Silver, por señalarme en la dirección correcta.

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

Fuente

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 brindé una solución alternativa que funcionó para mí 🙂

Pruebe esto antes de su primer campo editable:

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

onCreate en el método onCreate :

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

La respuesta más simple, simplemente agregue esto en el diseño principal del XML.

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

Siendo que no me gusta contaminar el XML con algo que está relacionado con la funcionalidad, creé este método que “roba” de manera transparente 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; } 

Tarde, pero tal vez útil. Crea un EditText ficticio en la parte superior de tu diseño y luego llama a myDummyEditText.requestFocus() en onCreate()

  

Eso parece comportarse como espero. No es necesario manejar los cambios de configuración, etc. Lo necesitaba para una actividad con una larga vista de texto (instrucciones).

Sí, hice lo mismo: crear un diseño lineal “ficticio” que obtenga el enfoque inicial. Además, configuré los ‘próximos’ ID de enfoque para que el usuario no pueda enfocarlo más después de desplazarse una vez:

   dummy.setNextFocusDownId(et.getId()); dummy.setNextFocusUpId(et.getId()); et.setNextFocusUpId(et.getId()); 

un montón de trabajo solo para deshacerte del enfoque en una vista …

Gracias

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

    

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

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

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

Escriba esta línea en su Diseño principal …

  android:focusableInTouchMode="true" 

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

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

Esto detuvo el teclado suave que se acercaba y no aparecía el cursor parpadeando en EditText.

Escriba este código dentro del archivo Manifest en la Activity donde no desea abrir el teclado.

 android:windowSoftInputMode="stateHidden" 

Archivo manifiesto

  < ?xml version="1.0" encoding="utf-8"?>              

En onCreate of your Activity, solo agregue use 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 eso. Por ejemplo,

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

Puede lograrlo creando un EditText ficticio con ancho y alto de diseño establecidos en 0dp , y solicite enfoque a esa vista. Agregue el siguiente fragmento de código en su diseño xml:

    

Asegúrese de eliminar la línea "" de la etiqueta EditText en xml.