2011年12月20日火曜日

SeekBarのバージョン別動作

Androidアプリ開発を行う過程で、ScrollViewを利用した画面を開発する際に
SeekBarを合わせて利用する人もいると思います。
私の場合は、HorizontalScrollViewでページスクロール画面を作成し、
画面下部にSeekBarを配置して、ページの移動を実現していました。

このSeekBarの動作が、Android 2.3 までと、3.0以降では動きが違うことが
分かったので、書き留めておきます。

SeekBar seekBar = (SeekBar) findViewById(R.id.seekBar);
seekBar.setOnSeekBarChangeListener(this);

seekBar.setMax(最大値);

上記のように動的に初期化を行うことも多いと思いますが、
Android 3.0以降では、setMax() メソッドを実行した直後に、

以下の処理を実行します。
※Android 2.3までは、上記の処理を実行しません。



@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean flag){

  //つまみを移動した時の処理

}

具体的には、以下のような値がセットされます。

i = 0;
flag = false;

私の場合は、setMax() メソッドを呼び出したタイミングで、つまみを移動
したときの処理が実行されてしまい、その結果、横スクロールビューが、
1番左に遷移するという事象になっていました。

これを回避するためには、以下のようにすれば大丈夫です。


@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean flag){

    if( flag ) {
   
      //つまみを移動した時の処理

    }

}

flag には、setMax() によって初期化された時は「false」が設定されるようです。
ユーザがつまみを移動させた時は、「true」が設定されるので上記のように
指定することで初期化の際に想定外の動作が実施されることがなくなります。