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>