3163 votes

Comment empêcher l'EditText d'obtenir le focus au démarrage de l'activité sous Android ?

J'ai un Activity dans Android, avec deux éléments :

  1. EditText
  2. ListView

Quand mon Activity commence, le EditText a immédiatement le focus sur l'entrée (curseur clignotant). Je ne veux pas qu'un contrôle ait le focus sur l'entrée au démarrage. J'ai essayé :

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

Pas de chance. Comment puis-je convaincre le EditText de ne pas se sélectionner lorsque le Activity commence ?

2847voto

morganchristiansson Points 5603

Excellentes réponses de Luc et Mark. Cependant, il manque un bon exemple de code. Ajout des balises android:focusableInTouchMode="true" y android:focusable="true" à la disposition parent (par exemple LinearLayout o ConstraintLayout ) comme dans l'exemple suivant, règlera le problème.

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

757 votes

Qu'en est-il de la définition de la parent disposition pour android:focusableInTouchMode="true" ¡!

0 votes

@MuhammadBabar Android:focusableInTouchMode="true" créer une vue zoom dans l'émulateur

0 votes

Dans mon cas, l'ajout à une vue de texte fonctionne également.

1739voto

Joe Points 20463

Est-ce que le problème réel est que vous ne voulez pas qu'il y ait de mise au point du tout ? Ou bien vous ne voulez pas que le clavier virtuel s'affiche en raison de la mise au point sur l'écran de l'ordinateur ? EditText ? Je ne vois pas vraiment de problème avec les EditText d'avoir un focus sur le début, mais c'est définitivement un problème d'avoir la fenêtre de softInput ouverte quand l'utilisateur n'a pas explicitement demandé d'avoir le focus sur la fenêtre de softInput. EditText (et ouvrir le clavier en conséquence).

S'il s'agit d'un problème de clavier virtuel, voir la section AndroidManifest.xml élément <activity> documentation.

android:windowSoftInputMode="stateHidden" - toujours le cacher en entrant dans l'activité.

ou android:windowSoftInputMode="stateUnchanged" - ne le modifie pas (par exemple, ne pas montrer si elle n'est pas déjà affichée, mais si elle était ouverte en entrant dans l'activité, laissez-la ouverte).

27 votes

Pourtant, le curseur se trouve toujours dans le premier EditText de la présentation, même si le clavier n'est pas affiché.

45 votes

Anderson : Rien dans la réponse n'impliquait qu'elle empêcherait la EditText d'obtenir la mise au point. En fait, il est clairement indiqué que c'est ainsi que vous empêchez la clavier logiciel IME de s'ouvrir automatiquement au moment de la mise au point, car il est plus probable que le problème le plus important soit l'apparition inattendue du clavier virtuel, no la mise au point elle-même. Si votre problème concerne le EditText qui n'ont pas de concentration du tout, alors utilisez la réponse de quelqu'un d'autre.

1204voto

Silver Points 4470

Une solution plus simple existe. Définissez ces attributs dans votre mise en page parent :

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

Et maintenant, lorsque l'activité démarre, cette mise en page principale recevra le focus par défaut.

De plus, nous pouvons retirer le focus des vues enfant au moment de l'exécution (par exemple, après avoir terminé l'édition de l'enfant) en redonnant le focus à la disposition principale, comme ceci :

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

Bon commentaire de Guillaume Perrot :

android:descendantFocusability="beforeDescendants" semble être la par défaut (la valeur entière est 0). Cela fonctionne simplement en ajoutant android:focusableInTouchMode="true" .

Vraiment, on peut voir que le beforeDescendants défini par défaut dans le ViewGroup.initViewGroup() (Android 2.2.2). Mais pas égal à 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Merci à Guillaume.

455voto

Luc Points 1489

La seule solution que j'ai trouvée est :

  • Crear un LinearLayout (Je ne sais pas si d'autres types de Layout fonctionneront)
  • Définir les attributs android:focusable="true" y android:focusableInTouchMode="true"

Et le EditText n'obtiendra pas le focus après le démarrage de l'activité.

100voto

floydaddict Points 397

Le problème semble provenir d'une propriété que je ne peux voir que dans l'interface de l'utilisateur. XML form de la mise en page.

Veillez à supprimer cette ligne à la fin de la déclaration dans le fichier EditText Balises XML :

<requestFocus />

Cela devrait donner quelque chose comme ça :

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X