Spinnerのバグでハマる

久しぶりに開発ネタ。

つい先日、表題のSpinnerのバグでハマったのでお知らせついでに書いときます。
AndroidのSpinnerはWindowsでいえばコンボボックスみたいなものです。
このSpinnerですが、Activity開始時とレジューム状態からの復帰とでは動作が異なるのです。

以下のコードを実行してみる。
毎回「さしすせそ」を必ず選択させるプログラムです。

protected void onStart() {
    super.onStart();

    Log.v("SuppinerBug", "onStart");

    Spinner spinner = (Spinner)findViewById(R.id.Spinner01);
    if( spinner != null ){
        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        adapter.add("あいうえお");
        adapter.add("かきくけこ");
        adapter.add("さしすせそ");
        adapter.add("たちつてと");
        adapter.add("なにぬねの");

        spinner.setAdapter(adapter);

        // さしすせそ を常に選択
        spinner.setSelection(2);

        Log.v("SuppinerBug", "set Spinner selected index.");
    }
}

これを実行すると

起動直後は期待通りの動作です。
ここで、Spinnerを見てみると以下のようになっています。


ちゃんと3番目の「さしすせそ」が選択されています。
問題ありません。

さて、ここでサブの画面を起動します。
ボタンをクリックして、サブの画面からすぐに戻ってきます。
すると。。。

あらら、「あいうえお」が選択されているように見えます。
本当に「あいうえお」が選択されているんかSpinnerを開いてみます
すると

あら?
「さしすせそ」が選択状態のようです。
そう、これがバグです。
結構有名みたいで、海外サイトではすぐに見つかります。
※サンプルはないですがw

簡単に再現するサンプルをまた一式用意しました。
再現させてみてください。
※尚、例によってこのサンプルのソースコードは修正BSDライセンスの元に配布して構いません。


※setAdapterをした後に、notifyDataSetChangedを呼べば一応回避できるみたいです。

SpinnerBug サンプルのダウンロード



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>