Learn to Live and Live to Learn

IT(たまにビジネス)に関する記事を読んで、考えて、使ってみたことをまとめる場。

Android Spinner#onItemSelectedが起動時にも実行されることへの対策

Spinner#onItemSelected

初回起動時もSelectされたとして反応してしまいます.
初回は処理を避けたい時の対応方法を紹介します.

実装

よくある方法にSpinnerがフォーカス可能かをフラグとして使うものがあります.
falseが初回起動,trueがそれ以降です.
バックグラウンドから復帰した時は初回と判定されます.
フォーカス可能かはSpinner#setFoucusableで設定できて,値はSpinner#isFocusableで取得できます.

もちろんフォーカスの代わりにメンバー変数でFlagを持っといてもOKです. メンバー変数バージョンはコメントアウトに記載しました.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private Spinner mSpinner;
    // private boolean mIsFirstBoot = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSpinner = (Spinner) findViewById(R.id.spinner);
        mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                // 初回起動時の動作
                if (mSpinner.isFocusable() == false) {
                // if (mIsFirstBoot) {
                    mSpinner.setFocusable(true);
                    // mIsFirstBoot = false;
                    Toast.makeText(getApplicationContext(), "初回起動", Toast.LENGTH_SHORT).show();
                    return;
                }
                // 初回以降の動作
                Toast.makeText(getApplicationContext(), "初回以降", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });
        // 初回起動時の対応
        mSpinner.setFocusable(false);
    }
}

activity_main.xml

(略)
    <Spinner
        android:id="@+id/spinner"
        android:entries="@array/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"></Spinner>
(略)

strings.xml

<resources>
    <string name="app_name">TestApp001</string>
    <string-array name="list">
        <item>hoge</item>
        <item>fuga</item>
        <item>piyo</item>
    </string-array>
</resources>

参考

d.hatena.ne.jp