状態によって見た目を変更したい場合で、onResumeでActivityが再描画されるたびにsetProgressDrawableを実行するようにしてしまうと、いったん別のActivityに移動して戻ってくると消えてしまいます。
なんでだー、なんでだーと思ってたのです。
原因がわかりました。
setProgressDrawableとかsetThumbを実行した後に、onSizeChangedが発行されないといけなかったのでした。
なので、実際には1回目でもタイミングによっては消えるはずです。
少なくともProgressBarとSeekBarはonSizeChangedの中でしか設定されているDrawableへsetBoundsを実行しないので描画しようとするけど見えない状況になってしまっています。
Viewクラスの背景は描画するタイミングでsetBoundsをしてるので他のwidgetでsetBackgroundDrawableをした時は問題なく意図通り動作します。
対策その1
無理やりいったんサイズを変更してonSizeChangedを起こさせる
Hoge_LayerListは、<layer-list>の定義されたxmlです。
SeekBar seek = (SeekBar)findViewById(R.id.Hoge_SeekBar); //新しいDrawableへ変更 Drawable d = getResources().getDrawable(R.id.Hoge_LayerList); seek.setProgressDrawable(d); //プログレスのカーソル変更 d = getResources().getDrawable(R.id.Hoge_Image); seek.setThumb(d); //プログレスの塗り具合の更新のために、いったん位置を変更します int progress = seek.getProgress() seek.setProgress(0); seek.setProgress(progress); //無理やりいったんサイズを変更する seek.layout(seek.getLeft()-1, seek.getTop(), seek.getRight(), seek.getBottom()); seek.layout(seek.getLeft()+1, seek.getTop(), seek.getRight(), seek.getBottom());
対策その2
予め現状のBouds情報を設定したDrawbleを指定する。
プログレスバーならこっちでも可。
シークバーでもカーソルを変更しないならこっちでもOK。こっちのやり方のほうがスマートな気はするんですけどね。カーソルのDrawableを取得できないので仕方ありません。
SeekBar seek = (SeekBar)findViewById(R.id.Hoge_SeekBar); Drawable d = getResources().getDrawable(R.id.Hoge_SeekBar); //現状のDrawableからBoundsを取得してこれから設定しようとする //Drawableへ予め設定する Drawable now = seek.getProgressDrawable(); Rect now_rect = now.getBounds(); d.setBounds(now_rect); //再設定する seek.setProgressDrawable(d); //プログレスの塗り具合の更新のために、いったん位置を変更します int progress = seek.getProgress() seek.setProgress(0); seek.setProgress(progress);
コメント