読者です 読者をやめる 読者になる 読者になる

モノワスレ

ブログに書いて忘れましょう

Spinner の onItemSelected 対策

Android

困った話

onCreate > onStart > onResume と動きますが…
onCreate で Spinnerのイベントリスナー(OnItemSelectedListener)を設定すると onResume した後に設定したリスナーが動作する。

何も選択していない状態から選択した状態になったって解釈ですかね?
正しい使い方なのかわかっていないような気もしますが…暫定回避方法をメモしておきます。

ソース

public class SampleActivity extends Activity
    implements OnItemSelectedListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Spinner spinner = (Spinner) findViewById(R.id.spinner);
        spinner.setOnItemSelectedListener(this);
    }

    @Override
    protected void onStart () {
        super.onStart();
        // 初期選択状態の設定 ※1
        ((Spinner)findViewById(R.id.spinner)).setFocusable(false);
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        Spinner spinner = (Spinner)findViewById(R.id.spinner);
        if(spinner.isFocusable() == false){ // 初回起動時の動作 ※2
            spinner.setFocusable(true);
            return;
        } else {
            // 初回でない場合の処理を記述する。 ※3
        }
    }
}

※1. onStartでspinnerの要素でとりあえず使っていないプロパティ Focusable*1 を設定します。
※2. 起動時に onItemSelected が勝手に呼ばれた時にフラグを反転して終了します。
※3. 通常選択時は、こちらが呼ばれます。

*1:Viewがフォーカスを取得可能か。