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. À part cela, je m'efforce de rendre les choses aussi déroutantes et déroutantes que possible.
Je rigole :-)
J'ai trois TableRow
s, chacun contenant un contrôle EditText en lecture seule et non focalisable, puis un bouton à sa droite. Chaque bouton démarre la même activité mais avec un argument différent. L'utilisateur y fait une sélection et la sous-activité se termine, en remplissant la sélection appropriée EditText
avec la sélection de l'utilisateur.
C'est le mécanisme classique des valeurs en cascade; chaque sélection réduit les options disponibles pour la sélection suivante, etc. Ainsi, je désactive les deux contrôles sur chacune des lignes suivantes jusqu'à ce que EditText sur la ligne actuelle contienne une valeur.
Je dois faire l'une des deux choses suivantes, dans cet ordre de préférence:
- Lorsqu'un bouton est cliqué, supprimez immédiatement le focus sans définir le focus sur un bouton différent
- Mettre le focus sur le premier bouton lorsque l'activité commence
Le problème se manifeste après le retour de la sous-activité; le bouton sur lequel vous avez cliqué conserve le focus.
Re: # 1 ci-dessus - Il ne semble pas y avoir de removeFocus()
méthode 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 l'activité parent onCreate()
.
J'ai besoin de cohérence de l'interface utilisateur dans les deux sens - soit aucun bouton n'a le focus une fois la sous-activité terminée, soit chaque bouton reçoit le focus en fonction de sa place dans le flux logique, y compris le tout premier (et seul) bouton actif avant toute sélection.
la source
Ancienne question, mais je suis tombée dessus quand j'ai eu un problème similaire et j'ai pensé que je partagerais ce que j'ai fini par faire.
La vue qui a gagné l'attention était différente à chaque fois, j'ai donc utilisé le très générique:
la source
getCurrentFocus()?.clearFocus();
, si beau et élégant: - /Vous pouvez utiliser
View.clearFocus()
.Utilisez
View.requestFocus()
appelé deonResume()
.la source
android:descendantFocusability="beforeDescendants"
l'utilisation des éléments suivants dans l'activité avec certaines options de mise en page ci-dessous semble fonctionner comme vous le souhaitez.
en relation avec les paramètres suivants sur la vue racine.
https://developer.android.com/reference/android/view/ViewGroup#attr_android:descendantFocusability
Répondez grâce à: https://forums.xamarin.com/discussion/1856/how-to-disable-auto-focus-on-edit-text
À propos de windowSoftInputMode
la source
J'utilise ceci lorsque j'ai déjà terminé de mettre à jour les informations de profil et de supprimer tout le focus d'EditText dans ma mise en page
====> Mise à jour: Dans le contenu de la mise en page parent, ma ligne d'ajout EditText:
la source
Qu'en est-il simplement d'ajouter
android:windowSoftInputMode="stateHidden"
votre activité dans le manifeste.Tiré d'un homme intelligent commentant ceci: https://stackoverflow.com/a/2059394/956975
la source
Tout d'abord, cela fonctionnera à 100% ........
onResume()
méthode.onResume()
retrouvez la vue qui se concentre encore et encorefindViewById()
.onResume()
ensemblerequestFocus()
à cette vue.onResume()
ensembleclearFocus
à cette vue.focusable
vrai etfocusableInTuch
vrai.onResume()
trouvez la vue de dessus ci-dessus parfindViewById
onResume()
ensemblerequestFocus()
à cette vue à la fin.la source
J'ai essayé de désactiver et d'activer la mise au point pour la vue et cela a fonctionné pour moi (la mise au point a été réinitialisée):
la source
Vous pouvez essayer de désactiver la capacité de l'activité principale à enregistrer son état (en lui faisant ainsi oublier quel contrôle avait du texte et ce qui avait le focus). Vous aurez besoin d'un autre moyen de vous souvenir de ce que vos EditText ont et de les repeupler surResume (). Lancez vos sous-activités avec startActivityForResult () et créez un gestionnaire onActivityResult () dans votre activité principale qui mettra à jour correctement les EditText. De cette façon, vous pouvez définir le bouton approprié que vous voulez focaliser surResume () en même temps que vous remplissez le EditText en utilisant un myButton.post (new Runnable () {run () {myButton.requestFocus ();}});
La méthode View.post () est utile pour définir le focus initialement car ce runnable sera exécuté après la création de la fenêtre et le stabilisation des choses, 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, j'ai trouvé.
Veuillez noter que c'est pseudo-code et non testé, mais c'est une direction possible que vous pourriez essayer.
la source
Ajoutez-les à votre ViewGroup qui inclut votre EditTextView. Cela fonctionne correctement avec ma disposition des contraintes. J'espère que cette aide
la source
Essayez ce qui suit (appelez
clearAllEditTextFocuses();
)la source