web-dev-qa-db-fra.com

Comment définir un message d'erreur pour le Spinner dans Android?

J'aimerais pouvoir appeler du code comme celui-ci, similaire à la façon dont setError est défini sur un TextView:

spinner.setError("Error message");

Cependant, setError ne fonctionne que pour un EditText, pas pour un Spinner.

Je veux informer l'utilisateur si le champ spinner n'est pas sélectionné. Comment puis-je effectuer une telle notification sans utiliser de Toast?

38
Gopinath S

Il y a quelques solutions dans ce fil Création d'un setError () pour le Spinner :

Celui de EdmundYeung99 fonctionne pour moi, que vous utilisiez votre propre adaptateur ou non. Mettez simplement le code suivant dans votre fonction de validation:

TextView errorText = (TextView)mySpinner.getSelectedView();
errorText.setError("");
errorText.setTextColor(Color.RED);//just to highlight that this is an error
errorText.setText("my actual error text");//changes the selected item text to this

Mais assurez-vous d'avoir au moins une valeur dans l'adaptateur Spinner lorsque vous effectuez votre vérification. Sinon, comme un adaptateur vide en attente de remplissage, faites en sorte que votre adaptateur obtienne une chaîne vide:

ArrayAdapter<String> adapter = new ArrayAdapter<>(context, Android.R.layout.simple_spinner_item, new String[]{""});
mySpinner.setAdapter(adapter);
66
Lionel T.

La classe Spinner retournera une vue de texte lorsque vous utilisez getSelectedView(). Vous pouvez donc utiliser setError() indirectement.

((TextView)spinner.getSelectedView()).setError("Error message");

Les résultats devraient être comme ...

setError in spinner

J'espère que ce sera utile!

30
Khan

Voici une solution qui utilise une TextView cachée pour faire apparaître un message contextuel, en plus de l'icône d'erreur dans le spinner. En cas d'erreur, le Spinner ressemble à ceci:

Spinner in invalid state

Lorsqu'il n'est pas dans un état d'erreur, il ressemble à ceci.

Spinner in valid state

La solution complète est documentée ici: https://stackoverflow.com/a/29956372/3063884

2
CJBS