2010-08-13 131 views
3

我有一個Android微調,當用戶按下「返回鍵」時,顯示微調的選擇面板時,我想聽的事件。我實現了OnItemSelectedListener,但onNothingSelected(AdapterView arg0)沒有被調用時, 。
爲什麼spinner中的onNothingSelected未被調用?

我只是想聽用戶什麼都沒有選擇(或選擇面板消失)的事件。

有沒有正確的方法來做到這一點?

謝謝!


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"); 
       } 
      }); 

這是Android 2.2的SDK的樣本,它也沒有表現出 「Spinner1:未選中」 當選擇面板中消失。

回答

3

看起來你不能在沒有擴展Spinner類的情況下做你想做的事。看起來Spinner沒有註冊OnCancelListener,而它構建的AlertDialog顯示這些項目。

代碼從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; 
    } 

此外,setSelection單擊該對話框中的項目時,纔會調用。當用戶按下後退按鈕時這將不會被調用,因爲這是一個OnCancel事件。

擴展Spinner將會有點痛,因爲你必須將所有東西都拷貝回來源於android源代碼中,因爲實現所需的各種成員字段只在程序包級別公開。

+0

真誠感謝Qberticus! 它似乎是現在處理它的唯一方法。 – RobertKing 2010-08-13 07:29:37

+1

@Qberticus我想我不明白什麼時候onNothingSelect會被調用?如果現在當你什麼都沒有選擇,那麼什麼時候? – 2013-09-04 19:29:09

0

另一種方法是創建一個最小的自定義的微調下拉菜單項,即:

<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" 
/> 

,然後攔截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 
    } 
} 

你可以,如果你使用自定義ArrayAdapter來巧妙本只設置其中一個下拉項目來完成回叫,以及設置 適合回調的上下文等。

根據wh當你在回調裏面做時,你可能想要 將它作爲可運行的,這樣微調器在它做任何事之前完全清理 。

相關問題