2017-07-30 80 views
1

我創建了一個自定義微調控件,因爲我一次又一次地發現,我想確保在設置我的微調控件的初始選擇或設置新的自定義適配器時,未觸發onItemSelectedListener。我只希望在用戶實際選擇一個項目時觸發它。爲什麼我的自定義微調器禁用/無響應?

但由於某種原因(我完全喪失了原因),我的自定義微調器不響應觸摸事件。就好像它已被禁用,即使我已經調試過,並且看到它已完全啓用。但由於某種原因,我的小微調不會打開。任何人都可以幫我理解爲什麼?

這裏的XML:

<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:layout_marginTop="@dimen/default_margin" 
     android:orientation="horizontal"> 
    <my.app.custom.view.MySpinner 
     android:id="@+id/dog_or_cat_toggle" 
     android:layout_width="0dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="2" 
     android:layout_margin="0dp" 
     android:textAlignment="center" 
     android:gravity="center_vertical|center" 
     android:padding="0dp" 
     android:entries="@array/dog_or_cat" 
     android:spinnerMode="dropdown" 
     android:background="@drawable/top_to_bottom_gray_gradient"/> 
    ... 
</LinearLayout> 

而且我的自定義微調:

/* A Spinner dispatches an onItemSelected event when the View is initialized, before the user ever makes a selection. 
* This class allows listeners for just the initial selection, just user selections, or both. */ 
public class MySpinner extends Spinner { 
    private boolean initialized = false; 
    private OnItemSelectedListener onItemSelectionInitializedListener; 
    private OnItemSelectedListener onItemSelectedByUserListener; 
    private OnItemSelectedListener onItemSelectedListener; 

    public MySpinner(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public MySpinner(Context context, AttributeSet attrs, int defStyleAttr) { 
     this(context, attrs, defStyleAttr, 0); 
    } 

    public MySpinner(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
     this.initializeMySpinner(); 
    } 

    public void setOnItemSelectionInitializedListener(OnItemSelectedListener onItemSelectionInitializedListener) { 
     this.onItemSelectionInitializedListener = onItemSelectionInitializedListener; 
    } 

    public void setOnItemSelectedByUserListener(OnItemSelectedListener onItemSelectedByUserListener) { 
     this.onItemSelectedByUserListener = onItemSelectedByUserListener; 
    } 

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

    @Override 
    public void setAdapter(SpinnerAdapter adapter) { 
     this.initialized = false; 
     super.setAdapter(adapter); 
    } 

    private void initializeMySpinner() { 
     super.setOnItemSelectedListener(new OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       if(!initialized) { 
        if(onItemSelectionInitializedListener != null) onItemSelectionInitializedListener.onItemSelected(parent, view, position, id); 
        if(onItemSelectedListener != null) onItemSelectedListener.onItemSelected(parent, view, position, id); 
        initialized = true; 
       } else { 
        if(onItemSelectedListener != null) onItemSelectedListener.onItemSelected(parent, view, position, id); 
        if(onItemSelectedByUserListener != null) onItemSelectedByUserListener.onItemSelected(parent, view, position, id); 
       } 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 
       if(!initialized) { 
        if(onItemSelectionInitializedListener != null) onItemSelectionInitializedListener.onNothingSelected(parent); 
        if(onItemSelectedListener != null) onItemSelectedListener.onNothingSelected(parent); 
        initialized = true; 
       } else { 
        if(onItemSelectedListener != null) onItemSelectedListener.onNothingSelected(parent); 
        if(onItemSelectedByUserListener != null) onItemSelectedByUserListener.onNothingSelected(parent); 
       } 
      } 
     }); 
    } 
} 
+0

看到https://pastebin.com/raw/mXAq3n4g – pskink

+0

你不需要任何自定義的'Spinner'類:看到上面的代碼,但如果你真的想要它,那麼替換'this(context,attrs,0); '用'this(context,attrs,android.R.attr.spinnerStyle);' – pskink

回答

1

不要從另一個調用一個構造函數。相反,從每一個調用super()構造函數。

我在一段時間後面臨同樣的問題,這個技巧奏效,但我不確定原因。

+0

我愛你Bob。這解決了它。 – SnoopDougg

+0

如果你不知道爲什麼會發生這種情況,那麼用this(context,attrs,android.R.attr.spinnerStyle)替換this(context,attrs,0);' – pskink

相關問題