115 votes

Comment supprimer la mise au point sans l'attribuer à un autre contrôle ?

J'aime que mes interfaces utilisateur soient intuitives ; chaque écran doit guider naturellement et discrètement l'utilisateur vers l'étape suivante de l'application. À défaut, je m'efforce de rendre les choses aussi confuses et déroutantes que possible.

Je plaisante :-)

J'ai trois TableRow contenant chacune un contrôle EditText en lecture seule et non focalisable, puis un bouton à sa droite. Chaque bouton lance la même activité, mais avec un argument différent. L'utilisateur y effectue une sélection et la sous-activité se termine en remplissant le champ EditText avec la sélection de l'utilisateur.

Il s'agit du mécanisme classique de valeurs en cascade ; chaque sélection réduit les options disponibles pour la sélection suivante, etc. Je désactive donc les deux contrôles sur chacune des lignes suivantes jusqu'à ce que l'EditText de la ligne actuelle contienne une valeur.

Je dois faire l'une des deux choses suivantes, par ordre de préférence :

  1. Lorsqu'un bouton est cliqué, retirer immédiatement le focus sans le placer sur un autre bouton.
  2. Mettre l'accent sur le premier bouton au début de l'activité

Le problème se manifeste après le retour de la sous-activité ; le bouton sur lequel on a cliqué conserve le focus.

Re : #N° 1 ci-dessus - Il ne semble pas y avoir d'outil d'évaluation des risques. removeFocus() ou quelque chose de similaire

Re : #2 ci-dessus - Je peux utiliser requestFocus() pour mettre le focus sur le bouton de la ligne suivante, et cela fonctionne après le retour de la sous-activité, mais pour une raison quelconque, cela ne fonctionne pas dans la fenêtre de l'activité parent. onCreate() .

J'ai besoin d'une cohérence de l'interface utilisateur dans les deux sens : soit aucun bouton n'a le focus après la fin de la sous-activité, soit chaque bouton reçoit le focus en fonction de sa place dans le flux logique, y compris le tout premier (et le seul) bouton actif avant toute sélection.

3voto

marienke Points 902

Pourquoi ne pas simplement ajouter android:windowSoftInputMode="stateHidden" sur votre activité dans le manifeste.

Tiré d'un commentaire d'un homme intelligent : https://stackoverflow.com/a/2059394/956975

3voto

Kessler Points 56

J'ai essayé de désactiver et d'activer la focalisation pour la vue et cela a fonctionné pour moi (la focalisation a été réinitialisée) :

focusedView.setFocusable(false);
focusedView.setFocusableInTouchMode(false);
focusedView.setFocusable(true);
focusedView.setFocusableInTouchMode(true);

2voto

Tout d'abord, il fonctionnera à 100 %........

  1. Créer onResume() méthode.
  2. À l'intérieur de ce onResume() trouver le point de vue qui se concentre encore et encore par findViewById() .
  3. À l'intérieur de ce onResume() fixer requestFocus() à ce point de vue.
  4. À l'intérieur de ce onResume() fixer clearFocus à ce point de vue.
  5. Allez dans xml du même schéma et trouvez la vue du dessus sur laquelle vous voulez vous concentrer et mettez-la en place. focusable vrai et focusableInTuch vrai.
  6. À l'intérieur de ce onResume() trouver la vue de dessus ci-dessus en findViewById
  7. À l'intérieur de ce onResume() fixer requestFocus() à ce point de vue à la fin.
  8. Et maintenant, profitez de ......

2voto

Tánh Lee Points 21
android:focusableInTouchMode="true"
android:focusable="true"
android:clickable="true"

Ajoutez-les à votre ViewGroup qui inclut votre EditTextView. Cela fonctionne correctement avec mon Constraint Layout. J'espère que cela vous aidera

1voto

Uncle Code Monkey Points 1276

Vous pouvez essayer de désactiver la capacité de l'activité principale à sauvegarder son état (ce qui lui permet d'oublier quel contrôle a du texte et quel contrôle a le focus). Vous devrez avoir un autre moyen de vous souvenir de ce que contiennent vos EditText et de les remplir à nouveau lors de la fonctionResume(). Lancez vos sous-activités avec startActivityForResult() et créez un gestionnaire onActivityResult() dans votre activité principale qui mettra à jour les EditText correctement. De cette façon, vous pouvez définir le bouton approprié que vous voulez focaliser surResume() en même temps que vous remplissez les EditText's en utilisant un gestionnaire myButton.post(new Runnable(){ run() { myButton.requestFocus() ; }. }) ;

La méthode View.post() est utile pour définir le focus initialement parce que ce runnable sera exécuté après la création de la fenêtre et que les choses se seront stabilisées, permettant au mécanisme de focus de fonctionner correctement à ce moment-là. Essayer de définir le focus pendant onCreate/Start/Resume() pose généralement des problèmes, je l'ai constaté.

Veuillez noter qu'il s'agit d'un pseudo-code et qu'il n'a pas été testé, mais c'est une direction possible que vous pouvez essayer.

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