validar tipos texto teclado tapar tapa studio solo salga que personalizar numeros evitar edittext con caja android listview android-edittext

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



tipos de edittext android (30)

¿El problema real es que simplemente no quieres que se centre? ¿O no desea que muestre el teclado virtual como resultado de enfocar EditText ? Realmente no veo un problema con el EditText centrado 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, como resultado, abrió el teclado).

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

android:windowSoftInputMode="stateHidden" : android:windowSoftInputMode="stateHidden" siempre cuando ingrese la actividad.

o android:windowSoftInputMode="stateUnchanged" - no lo cambies (por ejemplo, no lo muestres si aún no se muestra, pero si estaba abierto al ingresar a la actividad, déjalo abierto).

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 ?


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

Source


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


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>


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


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>


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


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


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.


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 )


La única solución que he encontrado es:

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

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


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

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


Lo más simple que hice fue enfocar otra vista en onCreate:

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

Esto detuvo la activación del teclado virtual y no había ningún cursor parpadeando en el texto de edición.


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.


Lo siguiente me funcionó en Manifest . Escribir ,

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


Necesitaba despejar el enfoque de todos los campos programáticamente. 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.


Ninguna de estas soluciones funcionó para mí. La forma en que arreglo el autofocus fue:

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


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 ponga esto como una vista antes de la vista enfocada problemática, y eso es todo.


Prueba esto antes de tu 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();


Pruebe clearFocus() 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.


Puede lograr esto creando un EditText ficticio con el ancho y la altura del diseño establecidos en 0dp y solicitando el enfoque en esa vista. Agregue el siguiente fragmento de código en su diseño xml:

<EditText android:id="@+id/editText0" android:layout_width="0dp" android:layout_height="0dp" android:hint="@string/dummy" android:ems="10" > <requestFocus /> </EditText>


Sí, hice lo mismo: crear un diseño lineal "ficticio" que tenga un enfoque inicial. Además, establezco las "siguientes" identificaciones de enfoque para que el usuario no pueda enfocarlas 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 ..

Gracias


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


Simplemente puede configurar "enfocable" y "enfocable en modo táctil" para valorar verdadero en el primer TextView del layout . De esta manera, cuando se inicie la actividad, TextView se enfocará pero, debido a su naturaleza, no verá nada enfocado en la pantalla y, por supuesto, no se mostrará ningún teclado ...


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

android:windowSoftInputMode="stateAlwaysHidden"


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

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

Eso parece comportarse como espero. No es necesario manejar los cambios de configuración, etc. Necesitaba esto para una Actividad con un TextView largo (instrucciones).


Usando la información proporcionada por otros carteles, usé la siguiente solución:

en el diseño XML

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


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