2017-07-30 30 views
1

Spinnerの初期選択を設定したり、新しいカスタムアダプターを設定したりしたときに、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); 'with' this(context、attrs、android.R.attr.spinnerStyle); ' – pskink

答えて

1

は別の1つのコンストラクタを呼び出さないでください。代わりに、それぞれからsuper()コンストラクタを呼び出します。

私は以前同じ問題に直面していましたが、このトリックはうまくいきましたが、その理由はわかりません。

+0

私はあなたを愛しています。それはそれを修正した。 – SnoopDougg

+0

これがなぜ起こるのかわからないなら 'this(context、attrs、0);を' this(context、attrs、android.R.attr.spinnerStyle);に置き換えてください。 – pskink

関連する問題