0

アプリに 2 つのボタンがあることを確認します。1 つは 30 秒のタイマーを開始し、もう 1 つは 60 秒のタイマーを開始します。タイマー起動も問題ありません。問題は、60 秒のボタンをクリックしてからすぐに 30 秒のボタンをクリックすると、テキストビューが 60 から 0 へのカウントダウンと 30 から 0 へのカウントダウンの間で切り替わるとします。59 28 57 26 などになります。知っておくべきことは、最初に 60 秒をクリックしてから 30 秒ボタンを押すと、60 秒のカウントダウンがキャンセルされ、30 秒のカウントダウンが開始されることです。

これが私のコードです。関連する部分のみを掲載しています。

[編集]コード全体を掲載しました。

package com.android.tapme;
import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class TapMe extends Activity {

private int countValue = 0, psuedoCountValue = 0;
private TextView textView1;
private TextView textView2;
Button tapButton;
Button sixty_seconds;
Button thirty_seconds;
private boolean thirtyon=false, sixtyon=false;
boolean timeUp=false;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tap_me);
    tapButton= (Button) findViewById(R.id.tapButton);
    textView1 = (TextView) findViewById(R.id.textView1);
    textView1.setTextSize(40);
    textView2 = (TextView) findViewById(R.id.textView2);
    textView2.setTextSize(20);
    thirty_seconds = (Button) findViewById(R.id.thirty_seconds);
    sixty_seconds= (Button) findViewById(R.id.sixty_seconds);
    sixty_seconds.setOnClickListener(new View.OnClickListener() {
              public void onClick(View v) {
                  timeUp=false;
                  countValue=0;
                  sixtyon=true;
                  checkTapValue();
                  MyCount myCount=new MyCount(60000,1000);
                  if(thirtyon==true)
                  {
                      myCount.cancel();
                  }
                  myCount=new MyCount(60000,1000);
                  thirtyon=false;
                  myCount.start();
            }
            });
    thirty_seconds.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                timeUp=false;
                countValue=0;
                thirtyon=true;
                checkTapValue();
                MyCount myCount=new MyCount(30000,1000);
                if(sixtyon==true)
                {
                    myCount.cancel();
                }
                myCount=new MyCount(30000,1000);
                sixtyon=false;
                myCount.start();
      }
    });
}
private void checkTapValue() {
    tapButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            if(timeUp==false)
            {
            countValue++;
            textView1.setText(Integer.toString(countValue));
            }
            else if(timeUp==true)
            {
            psuedoCountValue=countValue;
            textView1.setText(Integer.toString(psuedoCountValue));
            }
        }
    });

}
public void disable_Button()
{       
    timeUp=true;
    psuedoCountValue=countValue;
}

class MyCount extends CountDownTimer {
    public MyCount(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
    }
    @Override
    public void onFinish() {
        disable_Button();
        textView2.setText("Time's up!");
    }

    @Override
    public void onTick(long millisUntilFinished) {
        System.out.println(millisUntilFinished);
        textView2.setText("" + (int) (millisUntilFinished / 1000));
    }
}
}
4

2 に答える 2

1

現在の myCount への参照を保持していません。あなたが今行っていることは、新しいものを作成し (まだ開始されていません)、それをキャンセルすることです。

次のようになります。

public class TapMe extends Activity {

    // all other fields

    private MyCount currentCount;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        // code...

        sixty_seconds.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                timeUp=false;
                countValue=0;
                sixtyon=true;
                checkTapValue();
                if (currentCount != null) {
                    currentCount.cancel();
                }
                currentCount=new MyCount(60000,1000);
                thirtyon=false;
                currentCount.start();
            }
        );

        // code...

    }    

    // the rest of the code

}
于 2012-07-20T17:03:26.383 に答える
0

@マーカスあなたの答えは正しいものではありませんでしたが、本質的にはそうでした。

2 つの別個のオブジェクトを作成し、一方がアクティブ化されている場合は一方をキャンセルする必要がありました。

                      if(thirtyCount!=null)
                  {
                      thirtyCount.cancel();
                  }
                  sixtyCount.start();

これが解決策です。

于 2012-07-21T08:58:15.730 に答える