2012-10-30 4 views
1

je tente de joindre un sur événement select à mon Android android.widget.SpinnerAndroid: Spinner sur sélectionné par l'utilisateur

Je sais Spinner.setOnItemSelectedListener existe mais fonctionnent pas comme je veux, Le problème avec la setOnItemSelectedListener est cette méthode est appel alors que le spinner est chargé avec un adaptateur et comme prédéfinir un élément est select.

Je veux une interface pour obtenir un événement pendant qu'un "utilisateur" sélectionne un élément du Spinner en utilisant l'écran Tuch. Également un événement qui est seulement appel pendant que l'utilisation sélectionne un article et non le programme sélectionne un article.

Je veux un événement qui est appelé pendant que l'utilisation sélectionne un élément de cette boîte de dialogue.

enter image description here

Répondre

3

je enfin trouver une solution qui fonctionne pour moi, en regard du code sur http://www.oschina.net/code/explore/android-4.0.1/core/java/android/widget/Spinner.java

J'ai découvert comment empêcher ou attacher plus de code à cette partie de code qui est exécutée pendant que l'utilisation montrera la liste déroulante et puis créer mon o ne instace de Spinner.

Ma classe spinner a une interface de définition d'utilisation OnSelectSpinnerListener qui sera exécutée pendant que l'utilisateur tuch le spinner, puis sélectionner un élément de la liste spinner.

/** 
* Create a DropDown Spinner/Select List, that also has some event for detect 
* action do by the use and action do by the system. 
* 
* Use {@link OnSelectSpinnerListener} for attach a listener to this 
* SelectSpinner. 
*/ 
public class SelectSpinner extends Spinner { 

    public interface OnSelectSpinnerListener { 

     /** 
     * Call before the drop down menu is show that allow use to select one 
     * of the item from the Spinner. 
     */ 
     public void onOpenSelectMenu(); 

     /** 
     * Call while the use press a button or item for select this. This will 
     * not be call while the system set a select value for the spinner. Use {@link SelectSpinner#setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener)} 
     * for get all event while a item is set to the spinner. 
     * 
     * @param index Select item as Index 
     * @param object Select item as Object 
     */ 
     public void onItemSelectByUser(int index, Object object); 
    } 
    private OnSelectSpinnerListener onSelectSpinnerListener; 

    public SelectSpinner(Context context) { 
     super(context); 

    } 

    public SelectSpinner(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public SelectSpinner(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public OnSelectSpinnerListener getOnSelectSpinnerListener() { 
     return onSelectSpinnerListener; 
    } 

    public void setOnSelectSpinnerListener(OnSelectSpinnerListener onSelectSpinnerListener) { 
     this.onSelectSpinnerListener = onSelectSpinnerListener; 
    } 

    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     super.onClick(dialog, which); 
     if (this.onSelectSpinnerListener != null) { 
      Object item = super.getItemAtPosition(which); 
      this.onSelectSpinnerListener.onItemSelectByUser(which, item); 
     } 
    } 

    @Override 
    public boolean performClick() { 
     if (this.onSelectSpinnerListener != null) { 
      this.onSelectSpinnerListener.onOpenSelectMenu(); 
     } 
     return super.performClick(); 
    } 
} 
+0

Cela ne fonctionne pas sur les dernières versions android, onClick n'est jamais appelé. –

+0

J'ai posté [this] (http://stackoverflow.com/a/24679564/2290538) réponse qui fonctionne pour les nouvelles versions d'android 4.0+ –

0
spinner.setOnItemSelectedListener(this) 
@Override 
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
    //here arg2 will return the number of option which user select 

spinner.setOnItemSelectedListener (nouveau OnItemSelectedListener() {

  switch (arg2) { 
      case 0: 

       // do something for london 
       Toast.makeText(getApplicationContext(), "London",Toast.LENGTH_SHORT).show(); 
       break; 
      case 1: 
       // do something for Paris 
       Toast.makeText(getApplicationContext(), "Paris",Toast.LENGTH_SHORT).show(); 
       break; 
      case 2: 
       // do something for Stockholm 
       Toast.makeText(getApplicationContext(), "Stockholm",Toast.LENGTH_SHORT).show(); 
       break; 

      default: 
       break; 
      } 

     } 
} 

@Override 
public void onNothingSelected(AdapterView<?> arg0) { 
    // TODO Auto-generated method stub enter code here 
} 
+1

je ne pouvais pas comprendre votre question. Si ce n'est pas la bonne réponse pour vous alors s'il vous plaît clarifier la question que voulez-vous faire lorsque l'utilisateur sélectionner l'option de spinner. merci. –

+0

Oui, mais ce que je dis 'setOnItemSelectedListener' ne fonctionne pas pour moi maintenant, base sur ce sera appel alors que le Spinner est créer et charger les éléments, je veux un événement qui sera seulement appel tandis que l'utilisation change select select par select l'article. –

+0

espérons qu'il vous aidera ... c'est ce que vous voulez –

2

Comme mentionné dans this quel que soit le onClick() ne fonctionne pas à partir, mais les versions récentes d'Android (je l'ai testé sur certaines versions de 4.0).

J'adapté la réponse pour this FIG-GHD742 qui travaille dans une version plus récente d'Android (testé sur 4.1 et 4.3):

public class SelectSpinner extends Spinner { 

    public interface OnSelectSpinnerListener { 

     public void onOpenSelectMenu(); 

     public void onItemSelectByUser(AdapterView<?> parent, View view, 
       int position, long id); 
    } 

    private boolean isUserOpen = false; 

    private List<OnSelectSpinnerListener> onSelectSpinnerListeners; 
    private OnItemSelectedListener onItemSelectedListener; 

    public SelectSpinner(Context context) { 
     super(context); 
     registerEvents(); 
    } 

    public SelectSpinner(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     registerEvents(); 
    } 

    public SelectSpinner(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     registerEvents(); 
    } 

    /** 
    * Register default events 
    * */ 
    private void registerEvents() { 
     // overrides the default event for android OnItemSelectedListener 
     super.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 

      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, 
        int position, long id) { 
       if (onItemSelectedListener != null) { 
        // call onItemSelected default event in android 
        onItemSelectedListener.onItemSelected(parent, view, 
          position, id); 
       } 
       // checks if the spinner selection is opened by the user and has event listener 
       if (isUserOpen && onSelectSpinnerListeners != null) { 
        for (OnSelectSpinnerListener listener : onSelectSpinnerListeners) { 
         listener.onItemSelectByUser(parent, view, position, id); 
        } 
        isUserOpen = false; 
       } 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 
       if (onItemSelectedListener != null) { 
        // call onNothingSelected default event in android 
        onItemSelectedListener.onNothingSelected(parent); 
       } 
      } 
     }); 
    } 

    public void addOnSelectSpinnerListener(
      OnSelectSpinnerListener onSelectSpinnerListener) { 
     if (this.onSelectSpinnerListeners == null) { 
      this.onSelectSpinnerListeners = new ArrayList<SelectSpinner.OnSelectSpinnerListener>(); 
     } 
     this.onSelectSpinnerListeners.add(onSelectSpinnerListener); 
    } 

    @Override 
    public void setOnItemSelectedListener(OnItemSelectedListener listener) { 
     this.onItemSelectedListener = listener; 
    } 

    @Override 
    public boolean performClick() { 
     // isUserOpen variable set to true, to indicate that there was user interaction 
     isUserOpen = true; 
     if (this.onSelectSpinnerListeners != null) { 
      for (OnSelectSpinnerListener listener : this.onSelectSpinnerListeners) { 
       // call onOpenSelectMenu event 
       listener.onOpenSelectMenu(); 
      } 
     } 
     return super.performClick(); 
    } 
} 
Questions connexes