2010-08-13 3 views
3

J'ai un Spinner Android et je veux écouter l'événement lorsque l'utilisateur appuie sur "Back Key" lorsque le panneau de sélection du spinner est affiché. J'ai implémenté le OnItemSelectedListener, mais onNothingSelected (AdapterView arg0) n'a pas été invoqué quand pressez la touche retour . Je veux juste écouter l'événement lorsque l'utilisateur ne sélectionne rien (ou le panneau de sélection disparaît).
pourquoi le onNothingSelected dans spinner n'est pas invoqué?

Existe-t-il une façon correcte de procéder?

Merci!


Spinner s1 = (Spinner) findViewById(R.id.spinner1); 
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
      this, R.array.colors, android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    s1.setAdapter(adapter); 
    s1.setOnItemSelectedListener(
      new OnItemSelectedListener() { 
       public void onItemSelected(
         AdapterView<?> parent, View view, int position, long id) { 
        showToast("Spinner1: position=" + position + " id=" + id); 
       } 

       public void onNothingSelected(AdapterView<?> parent) { 
        showToast("Spinner1: unselected"); 
       } 
      }); 

Ceci est un exemple dans le SDK Android 2.2, il est pas non plus montrer "Spinner1: désélectionné" lorsque le panneau de sélection disparaît.

Répondre

3

Il semble que vous ne puissiez pas faire ce que vous voulez sans étendre la classe Spinner. Il semble que Spinner n'enregistre pas un OnCancelListener avec le AlertDialog qu'il construit pour afficher les éléments.

code de Spinner.java:

@Override 
    public boolean performClick() { 
     boolean handled = super.performClick(); 

     if (!handled) { 
      handled = true; 
      Context context = getContext(); 

      final DropDownAdapter adapter = new DropDownAdapter(getAdapter()); 

      AlertDialog.Builder builder = new AlertDialog.Builder(context); 
      if (mPrompt != null) { 
       builder.setTitle(mPrompt); 
      } 
      mPopup = builder.setSingleChoiceItems(adapter, getSelectedItemPosition(), this).show(); 
     } 

     return handled; 
    } 

    public void onClick(DialogInterface dialog, int which) { 
     setSelection(which); 
     dialog.dismiss(); 
     mPopup = null; 
    } 

En outre, setSelection est seulement appelé quand un élément dans la boîte de dialogue est cliqué. Cela ne sera pas appelé lorsque l'utilisateur appuie sur le bouton de retour, car il s'agit d'un événement OnCancel.

Extension Spinner sera un peu d'une douleur puisque vous devez copier tout retour à la AdapterView dans la source de la source Android depuis divers domaines membres nécessaires à la mise en œuvre ne sont exposés au niveau du package.

+0

Sincères remerciements à Qberticus! Il semble que ce soit la seule façon de le gérer maintenant. – RobertKing

+1

@Qberticus Je suppose que je ne comprends pas quand onNothingSelect est appelé alors? Si c'est maintenant quand vous ne sélectionnez rien, alors quand? –

0

Une autre approche est de créer un élément de menu déroulant spinner personnalisé minimale, à savoir:

<com.mypackage.MyTextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    style="?android:attr/spinnerDropDownItemStyle" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 

    android:textSize="25dp" 
/> 

puis intercepter onDetachedFromWindow():

public class MyTextView extends TextView { 

    public MyTextView(Context context) { 
     super(context); 
    } 

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

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

    @Override 
    protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     // Callback here 
    } 
} 

Vous pouvez finesse si vous utilisez un ArrayAdapter personnalisé pour régler que l'un des éléments de liste déroulante pour faire le rappel, ainsi que la mise contexte approprié pour le rappel, etc.

selon wh À l'intérieur de la fonction de rappel, vous pouvez l'afficher en tant que runnable, de sorte que le curseur soit entièrement nettoyé avant de faire quoi que ce soit.