IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants graphiques Android Discussion :

Spinner : pas de selection par défaut


Sujet :

Composants graphiques Android

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Points : 24
    Points
    24
    Par défaut Spinner : pas de selection par défaut
    Bonjour à tous,

    Je me bat depuis des heures avec les spinners... En effet, je voudrais avoir un comportement sans sélection par défaut, ce que ne peuvent pas faire les spinners de base.

    J'ai trouvé beaucoup de solution sur le net qui retardent la sélection jusqu'au moment du clique sur le spinner, ou qui encore change le contenu du premier élément par un autre texte (pour simuler un "hint") jusqu'au clique sur le spinner.

    Toutes ces solutions fonctionnent bien...seulement, quand on veut lancer une activité lors d'un clique sur le seul élément du spinner, ça pose un soucis. En effet, le onItemSelected n'est pas appelé lorsque la sélection ne change pas (elle a changé, puisqu'on est passé de "rien" ou d'un hint - selon les solutions choisie -, à un reel élément, mais les solutions proposés simulent seulement une non sélection... en réalité, le premier élément est toujours sélectionné !).

    Je me suis alors dit que j'allais l'appelé au changement de focus, seuleument, celui-ci peut avoir lieu à l'appui sur le bouton back... et je n'ai pas trouvé comment detecté cet appui dans la pop-up du spinner...


    Bref, comme vous l'avez surement constaté, ce n'est pas faute d'avoir cherché...
    Si quelqu'un à une solution à me proposer, je suis preneur !

    Merci de m'avoir lu dans tout les cas... et mort au Spinner ! ^^

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 322
    Points : 494
    Points
    494
    Par défaut
    Bonjour,
    Ce que tu peux faire c'est tout simplement te créer ton propre adapter pour spinner. Et comme ça dans la méthode getView tu affiches la valeur que tu veux quand aucun item n'est sélectionné.

    Edit : en fait c'est pas si simple

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Points : 24
    Points
    24
    Par défaut
    Effectivement, c'est pas si simple, j'utilise déjà un adapter perso avec un override du getView, mais ça ne solutionne malheureusement pas le problème :=(

  4. #4
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Bonjour,


    tu as une solution proposé par emmby ici, qui devrait t'intéresser :
    http://stackoverflow.com/questions/8...ext-select-one

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    /**
     * A modified Spinner that doesn't automatically select the first entry in the list.
     *
     * Shows the prompt if nothing is selected.
     *
     * Limitations: does not display prompt if the entry list is empty.
     */
    public class NoDefaultSpinner extends Spinner {
     
        public NoDefaultSpinner(Context context) {
            super(context);
        }
     
        public NoDefaultSpinner(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
     
        public NoDefaultSpinner(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
     
        @Override
        public void setAdapter(SpinnerAdapter orig ) {
            final SpinnerAdapter adapter = newProxy(orig);
     
            super.setAdapter(adapter);
     
            try {
                final Method m = AdapterView.class.getDeclaredMethod("setNextSelectedPositionInt",int.class);
                m.setAccessible(true);
                m.invoke(this,-1);
     
                final Method n = AdapterView.class.getDeclaredMethod("setSelectedPositionInt",int.class);
                n.setAccessible(true);
                n.invoke(this,-1);
     
            } catch( Exception e ) {
                throw new RuntimeException(e);
            }
        }
     
        protected SpinnerAdapter newProxy(SpinnerAdapter obj) {
            return (SpinnerAdapter) java.lang.reflect.Proxy.newProxyInstance(
                    obj.getClass().getClassLoader(),
                    new Class[]{SpinnerAdapter.class},
                    new SpinnerAdapterProxy(obj));
        }    
     
     
     
        /**
         * Intercepts getView() to display the prompt if position < 0
         */
        protected class SpinnerAdapterProxy implements InvocationHandler {
     
            protected SpinnerAdapter obj;
            protected Method getView;
     
     
            protected SpinnerAdapterProxy(SpinnerAdapter obj) {
                this.obj = obj;
                try {
                    this.getView = SpinnerAdapter.class.getMethod("getView",int.class,View.class,ViewGroup.class);
                } catch( Exception e ) {
                    throw new RuntimeException(e);
                }
            }
     
            public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
                try {
                    return m.equals(getView) && (Integer)(args[0])<0 ? getView((Integer)args[0],(View)args[1],(ViewGroup)args[2]) : m.invoke(obj, args);
                } catch (InvocationTargetException e) {
                    throw e.getTargetException();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
     
     
            protected View getView(int position, View convertView, ViewGroup parent) throws IllegalAccessException {
                if( position<0 ) {
                    final TextView v = (TextView) ((LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(android.R.layout.simple_spinner_item,parent,false);
                    v.setText(getPrompt());
                    return v;
                }
     
                return obj.getView(position,convertView,parent);
            }
     
        }
     
     
    }
    Je ne sais pas si cette solution fonctionne, mais je pense que c'est l'idée, par contre cette méthode n'est pas stable du fait qu'elle ne sera pas fonctionnelle dans les futures mise à jour d'Android :
    This has been tested on android 1.5 through 2.2, but buyer beware! Because this solution relies on reflection to call the private AdapterView.setNextSelectedPositionInt() and AdapterView.setSelectedPositionInt(), it's not guaranteed to work in future OS updates. It seems likely that it will, but it is by no means guaranteed.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup, c'est pile ce qu'il me fallait et ça marche super !

    Par contre, l'auteur dit "It seems likely that it will, but it is by no means guaranteed.", pour moi ça veut dire que ça devrait marché dans les futures versions mais que ce n'est pas garantie, alors que toi tu dis que catégoriquement que cela "ne sera pas fonctionnelle dans les futures mise à jour d'Android". J'ai pas bien compris ?

    Une dernière chose, il arrive que mon utilisateur clique sur un élément, et lance donc une nouvelle activité pour l'aider dans sa sélection dans le spinner. S'il fait retour et donc qu'il annule cette opération, j'aimerais remettre le spinner dans un état sans aucune sélection. Est ce qu'il y a un moyen de faire ça ?

    Merci encore

  6. #6
    Expert éminent

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Points : 9 149
    Points
    9 149
    Par défaut
    Par contre, l'auteur dit "It seems likely that it will, but it is by no means guaranteed.", pour moi ça veut dire que ça devrait marché dans les futures versions mais que ce n'est pas garantie, alors que toi tu dis que catégoriquement que cela "ne sera pas fonctionnelle dans les futures mise à jour d'Android". J'ai pas bien compris ?
    Désolé ,j'ai oublié le peut être dans ma phrase ...Sinon tu as bien compris la phrase.

    par contre cette méthode n'est pas stable du fait qu'elle ne sera peut être pas fonctionnelle dans les futures mise à jour d'Android :

    Une dernière chose, il arrive que mon utilisateur clique sur un élément, et lance donc une nouvelle activité pour l'aider dans sa sélection dans le spinner. S'il fait retour et donc qu'il annule cette opération, j'aimerais remettre le spinner dans un état sans aucune sélection. Est ce qu'il y a un moyen de faire ça ?
    Le but du jeu alors serait alors de remettre la position du spniner à -1 .

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Désolé ,j'ai oublié le peut être dans ma phrase ...Sinon tu as bien compris la phrase.
    Pas de mal, ça me rassure :=)

    Citation Envoyé par Feanorin Voir le message
    Le but du jeu alors serait alors de remettre la position du spniner à -1 .
    Merci pour cette précision, mais je n'y parviens pas. Es tu sur que cela soit si simple ? Voila ce que j'ai fais, je ne vois pas comment ça pourrait être faux (j'ai vérifié, je passe bien dan le onResume, et rien ne change).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @Override
    protected void onResume(){
     
    		super.onResume();
    		this.mySpinner.setSelection(-1);
     
    }

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 322
    Points : 494
    Points
    494
    Par défaut
    Bonjour,

    Tu dois utiliser cette méthode car celle que tu utilises ne peut pas afficher des valeurs dont l'index est négatif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.mySpinner.setSelection(-1, true);

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 61
    Points : 24
    Points
    24
    Par défaut
    Ah ! Merci ! Autant pour moi j'avais pas vu cette signature

    Merci à vous deux, sujet résolu

    EDIT : ah bah non, j'étais tellement sur que c'était la dessus que j'étais passé a coté... j'ai fait le test, je passe bien dans mon onResume mais ça marche toujours pas :=(

Discussions similaires

  1. [HTML 4.0] Dans un select : pas de selected par défaut
    Par jlb59 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 25/08/2011, 15h22
  2. Réponses: 4
    Dernier message: 15/05/2007, 08h46
  3. dataGrid : selection par défaut
    Par nounetmasque dans le forum Flash
    Réponses: 5
    Dernier message: 10/08/2006, 21h08
  4. Réponses: 8
    Dernier message: 06/12/2004, 12h24
  5. [TListBox] Selection par défaut
    Par Nuts07 dans le forum Composants VCL
    Réponses: 8
    Dernier message: 12/05/2003, 10h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo