2010-11-17 1 views
4

J'ai un problème de gestion d'un spinner, alors puis-je demander votre aide?Android - Spinner: comment puis-je distinguer les actions de l'utilisateur des actions de l'ordinateur dans un OnItemSelectedListener

J'ai une roue avec son adaptateur. J'initialise le spinner avec une liste de valeurs au démarrage de mon activité. Ensuite, je force la valeur sélectionnée à être celle utilisée dans l'objet que je gère. Une fois l'écran initialisé: Lorsque l'utilisateur sélectionne une valeur dans le compteur, en fonction de la valeur sélectionnée, je peux continuer (ou non) vers une autre activité pour laisser l'utilisateur choisir une valeur complémentaire et nécessaire. Si l'utilisateur "annule" cette deuxième activité, je veux revenir à la valeur sélectionnée précédemment et annuler certaines actions effectuées entre-temps. Si l'utilisateur va à la fin de la deuxième activité, tout va bien et je veux juste rafraîchir l'affichage de spinner avec les données sélectionnées dans la deuxième activité (je surcharge la méthode getView dans l'adaptateur pour ce faire). Dans l'ensemble, je peux facilement faire tout cela, cependant, quand je force la valeur sélectionnée dans le spinner au début de mon activité, ou quand je reviens de la deuxième activité par "Annuler", l'événement de valeur de changement est attrapé et la deuxième activité est déclenchée (l'utilisateur n'a rien cliqué du tout).

Comment autoriser la deuxième activité à être lancée uniquement si le changement de la valeur sélectionnée dans le compteur est dû à une action manuelle de l'utilisateur, et empêcher cette même seconde activité d'être lancée lorsque la valeur de spinner est changé "dans le code"?

J'ai essayé de nombreuses solutions, en définissant un booléen dans l'adaptateur qui indique si l'événement suivant sera déclenché en raison d'une action "dans le code". Ou aussi de mettre un booléen dans l'adaptateur qui indique si l'adaptateur s'est initialisé, et je force ce booléen à vrai sur l'événement catch ford change. Mais rien qui fonctionne vraiment bien.

Nous vous remercions de votre aide.

Oliver

Répondre

4

J'ai toujours résolu cette question avec des drapeaux booléens, il nest pas assez du tout, mais cela fonctionne si vous y réfléchissez.

L'idée est plus ou moins, créer un dans le onSelectedItemListener() utilisable booléenne et init avec faux global, utilisez ce booléen choisir si oui ou non pour déclencher l'action, la chose importante à retenir est de définissez-le sur true après que l'ordinateur l'a sélectionné automatiquement la première fois et réinitialisez-le sur false dans la méthode onResume().

Ce n'est pas parfait mais cela devrait fonctionner.

Edit:

bool spinnerUsable1; 
bool spinnerUsable2; 
int positionSpinner; 

public void onCreate(Bundle savedInstanceState){ 
    spinnerUsable1 = false; 
    spinnerUsable2 = true; 
    if(savedInstanceState != null){ 
     positionSpinner = savedInstanceState.getInt("posSpinner"); 
     if(positionSpinner != 0) spinnerUsable2 = false; 
    } 

    //Declare your spinner, set the on item selected lister 
    spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> arg0, View arg1, 
        int arg2, long arg3) { 
       boolean spinnerUsable = (spinnerUsable1 && spinnerUsable2); 
       if (!spinnerUsable1) { 
        spinnerUsable1 = true; 
       } else if (!spinnerUsable2) { 
        spinnerUsable2 = true; 
       } 
       if (spinnerUsable) { 
        //Action; 
       } 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> arg0) { 
       // Nothing 
      } 
     }); 
} 

Quelque chose comme cela devrait fonctionner.

+0

Merci. Pouvez-vous être un peu plus précis sur les endroits où vous changez le booléen? Parce que si je ne mets que la valeur booléenne la première fois qu'il est sélectionné par l'ordinateur (au spinner init), il semble que cela ne fonctionnera pas. C'est ce que j'ai essayé avec un booléen dans l'adaptateur du spinner.L'événement spinner est toujours déclenché quand j'appelle setSelection (ou quelque chose près de :-)) pour forcer la valeur de spinner, et dans le cas, je ne vois pas avec cette solution (ou votre) basée sur un booléen comment voir que c'est pas une interaction de l'utilisateur. – Oliver

+0

Édité ma réponse. – blindstuff

Questions connexes