문제

I want my app to switch two images with a delay of, let's say, 3 seconds. This is my former code:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        getFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment())
                .commit();
    }

    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {

        @Override
        public void run() {
            ImageView image = (ImageView)      
 findViewById(R.id.imgView_dice0);
            image.setImageResource(R.drawable.dice_6);      
        }
    }, 3000);
}
....

This works for switching the image one time. I tried putting the image-changing in two methods (and replacing R.drawable.dice_6 with R.drawable.dice_1) which are called with a delay, surrounded by a loop. That doesn't work, the app only shows one and the same dice all the time. What should I do?

도움이 되었습니까?

해결책

You should restart your Handler.postDelayed inside the runnable to make it work.

Something like:

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    private boolean useDiceOne;

    @Override
    public void run() {
        ImageView image = (ImageView)findViewById(R.id.imgView_dice0);
        if (!useDiceOne) {
         image.setImageResource(R.drawable.dice_6);
        } else {
         image.setImageResource(R.drawable.dice_1);
        }
        useDiceOne = !useDiceOne;
        handler.postDelayed(this, 3000);      
    }
 }, 3000);

useDiceOne will be used to change the image between dice_1 and dice_6 p.s cache the ImageView.

To make it more flexible (stop it when you want, etc.) you could save the handler reference (and runnable reference too) somewhere and use removeCallbacks

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top