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:
-
EditText
-
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
.
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 agregandoandroid: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"
yandroid: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"/>