2

レイアウトに進行状況バーが必要です。合計時間は 30 秒で、毎秒刻みます。基本的に、アプリのユーザーに、時間切れになるまでに 30 秒あることを確認してもらいたいと考えています。

これは私が書いたコードです。しかし、これにより、アクティビティのない空の進行状況バーが表示されます。助けてください。私は何を間違っていますか

public class MySeekBarActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);    
    setContentView(R.layout.main);
    setProgressBarVisibility(true);      

    final ProgressBar progressHorizontal = (ProgressBar) findViewById(R.id.progress_horizontal);
    progressHorizontal.setProgress(progressHorizontal.getProgress()* 100);

    new CountDownTimer(30000, 1000) { 
        public void onTick(long millisUntilFinished) {              
            progressHorizontal.incrementProgressBy(1);
            int dtotal = (int) ( 30000 - millisUntilFinished ) /30000 * 100;
            progressHorizontal.setProgress(dtotal);                
        }            
        public void onFinish() {
            // DO something when 2 minutes is up
       }
   }.start();
}
}
4

1 に答える 1

2

次の 2 つの理由により、型変換のバグがあります。

  • int で除算しているため、小数点以下が切り捨てられます。
  • また、結果のキャストが早すぎるため、float/double で除算しても結果は切り捨てられます。

つまり、コードから int へのキャストを安全に削除でき、とにかくコンパイルされます。これは、最終的な数値が int であることを意味します。以前にキャストを行っていないため、コードのかなり早い段階で 10 進数の情報が失われていることを意味します。

これは可能な修正です:

int dtotal = (int) (( 30000 - millisUntilFinished ) /(double)30000 * 100);

将来そのようなバグを解決するには、方程式を含むループを含むダミーの Java プログラムを作成し、中間結果を出力します。次に例を示します。

public class NumberTester {

    //define the constants in your loop
    static final int TOTAL_TIME = 30000;
    static final int INTERVAL = 1000;

    public static void main(String[] args) {

        //perform the loop
        for(int millisUntilFinished = TOTAL_TIME;millisUntilFinished >=0;millisUntilFinished -= INTERVAL) {
            int dtotal = (int) (( TOTAL_TIME - millisUntilFinished ) /(double)TOTAL_TIME * 100);
            System.out.println(dtotal);
        }

    }

}

また、いくつかの重要なこと:

  • onCreateでタイマーを開始しないでください。この時点では、アクティビティはまだ表示されていません。代わりにonResumeを使用してください。
  • onPauseでタイマーを強制終了します。このようにタイマーとスレッドを管理されないままにしておくのは悪い形であり、奇妙なバグにつながる可能性があります。
  • 「マジックナンバー」を使用しないでください。例で行ったように、すべての定数値を static final クラス メンバーに配置します。これにより、これらの値を変更する際の頭痛の種が大幅に軽減されます。

編集:進行状況バーが完了しない理由については、onTickメソッドの動作が、おそらく想定している動作とは少し異なるためです。私が何を意味するかを確認するには、次を追加します。

System.out.println("Milis:" + millisUntilFinished);
System.out.println("dtotal:" + dtotal);

onTickメソッドに。値は明らかに 0 までカウントダウンしません (したがって、dtotal の場合は 100 であり、millisUntilFinished から派生しています)。これを補正する必要があります。

于 2012-04-21T09:25:57.840 に答える