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.

188voto

actionshrimp Points 1698

L'utilisation de clearFocus() ne semblait pas fonctionner pour moi non plus, comme vous l'avez constaté (voir dans les commentaires d'une autre réponse), mais ce qui a fonctionné pour moi en fin de compte, c'est l'ajout de :

<LinearLayout 
    android:id="@+id/my_layout" 
    android:focusable="true" 
    android:focusableInTouchMode="true" ...>

à ma vue de présentation de très haut niveau (une présentation linéaire). Pour supprimer le focus de tous les boutons, textes d'édition, etc., il suffit de faire

LinearLayout myLayout = (LinearLayout) activity.findViewById(R.id.my_layout);
myLayout.requestFocus();

La demande de mise au point n'a rien donné, sauf si j'ai configuré la vue pour qu'elle puisse être mise au point.

90voto

willlma Points 1799

C'est une vieille question, mais je l'ai rencontrée lorsque j'ai eu un problème similaire et j'ai pensé partager ce que j'ai fini par faire.

La vue qui a attiré l'attention était différente à chaque fois, c'est pourquoi j'ai utilisé le terme très générique :

View current = getCurrentFocus();
if (current != null) current.clearFocus();

9voto

siliconeagle Points 2292
  1. Vous pouvez utiliser View.clearFocus() .

  2. Utilice View.requestFocus() appelé par onResume() .

9voto

CrandellWS Points 109

android:descendantFocusability="beforeDescendants"

l'utilisation de ce qui suit dans l'activité avec quelques options de mise en page ci-dessous semble fonctionner comme souhaité.

 getWindow().getDecorView().findViewById(android.R.id.content).clearFocus();

en relation avec les paramètres suivants de la vue Racine.

<?xml
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:descendantFocusability="beforeDescendants" />

https://developer.Android.com/reference/Android/view/ViewGroup#attr_android:descendantFocusability

Réponse grâce à : https://forums.xamarin.com/discussion/1856/how-to-disable-auto-focus-on-edit-text

À propos de windowSoftInputMode

Il y a encore un autre point de discorde à connaître. Par défaut, Android attribue automatiquement le focus initial au premier EditText ou à un contrôle focalisable dans votre activité. Il s'ensuit naturellement que la méthode InputMethod (typiquement le clavier souple) répondra à l'événement focus en s'affichant. L'attribut windowSoftInputMode dans le fichier AndroidManifest.xml, lorsqu'il est défini sur stateAlwaysHidden, indique au clavier d'ignorer cet événement automatique. d'ignorer ce focus initial attribué automatiquement.

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

grande référence

7voto

Ho Luong Points 348
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          android:id="@+id/ll_root_view"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:orientation="vertical">

LinearLayout llRootView = findViewBindId(R.id.ll_root_view);
llRootView.clearFocus();

Je l'utilise lorsque j'ai déjà terminé la mise à jour des informations de profil et que je supprime le focus de l'EditText dans ma mise en page.

\====> Mise à jour : Dans le contenu du layout parent, mon EditText ajoute une ligne :

android:focusableInTouchMode="true"

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