DialogFragment 内の ImageView の画像を 1 秒ごとに変更したい。コードは Android 5 または 4 で正常に実行されています。しかし、Android 2.3.7(api 10)では、UIを一度変更してからUIを変更しません.一方、スレッドはこれまでのところ問題なく実行されています.Timer、ハンドラ通常メソッド、runOnUIThreadでハンドラメッセージメソッドを試しました。View.Post メソッドですが、うまくいきません
Bitmap[] onItems = new Bitmap[3];
Bitmap[] offItems= new Bitmap[3];
ImageView[] cheatHoldrs = new ImageView[3];
public Dialog onCreateDialog(Bundle savedInstanceState) {
//all Bitmaps and ImageView has been inited
myMethod();
}
View.Post メソッド:
for (int i = 0; i < 3; i++) {
final int j = i;
cheatHoldrs[j].post(new Runnable() {
@Override
public void run() {
random Random = new Random();
cheatHoldrs[j].setImageBitmap((random.nextInt(3) % 3 == 1) ? onItems[j]
: offItems[j]);
cheatHoldrs[j].postDelayed(this, 1000);
}
});
}
RunOnUIThread
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
Random random = new Random();
for (int j = 0; j < 3; j++)
cheatHoldrs[j]
.setImageBitmap((random.nextInt(3) % 3 == 1) ? onItems[j]
: offItems[j]);
new Handler().postDelayed(this, 1000);
}
});
通常のハンドラー メソッド:
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
Random random = new Random();
for (int j = 0; j < 3; j++)
cheatHoldrs[j]
.setImageBitmap((random.nextInt(3) % 3 == 1) ? onItems[j]
: offItems[j]);
handler.postDelayed(this, 1000);
}
});
ハンドラ メッセージ メソッド :{ グローバル スコープ内 :
public Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
Random random = new Random();
for (int j = 0; j < 3; j++)
cheatHoldrs[j]
.setImageBitmap((random.nextInt(3) % 3 == 1) ? onItems[j]
: offItems[j]);
}
};
OnCreateDialog で:
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
mHandler.obtainMessage(1).sendToTarget();
}
}, 0, 1000);
}
編集:私は最終的に問題が何であるかを知っています。スレッドは正常に動作しており、アニメーションを使用しない場合、UI が更新されます。ダイアログが表示され始めたとき。アニメーションを開始し、ImageViews (cheatHoldrs) を移動します。アニメーション ImageViews 画像が変更された後。私はこのように9oldroidアニメーションとTranslateAnimationを試しましたが、アニメーション後にUIを変更することはまだありません.
TranslateAnimation animation = new TranslateAnimation(0, forLeft, 0, 0);
animation.setFillAfter(true);
animation.setDuration(1000);
cheatHoldrs[1].startAnimation(animation);
TranslateAnimation animation2 = new TranslateAnimation(0, forLeft, 0, 0);
animation2.setFillAfter(true);
animation2.setDuration(1000);
cheatHoldrs[2].startAnimation(animation2);
TranslateAnimation animation3 = new TranslateAnimation(0, forRight, 0, 0);
animation3.setFillAfter(true);
animation3.setDuration(1000);
cheatHoldrs[0].startAnimation(animation3);
そしてnineoldandroidsメソッド:
com.nineoldandroids.animation.ObjectAnimator transitionForFirst = com.nineoldandroids.animation.ObjectAnimator
.ofFloat(cheatHoldrs[0], "translationX", forRight);
transitionForFirst.setDuration(1000);
com.nineoldandroids.animation.ObjectAnimator transitionForSecound = com.nineoldandroids.animation.ObjectAnimator
.ofFloat(cheatHoldrs[1], "translationX", forLeft);
transitionForSecound.setDuration(1000);
com.nineoldandroids.animation.ObjectAnimator transitionForThird = com.nineoldandroids.animation.ObjectAnimator
.ofFloat(che
atHoldrs[2], "translationX", forLeft);
transitionForThird.setDuration(1000);
transitionForFirst.start();
transitionForSecound.start();
transitionForThird.start();