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

由于两件事,您有一个类型转换错误:

  • 你除以一个整数,这会导致小数被四舍五入,
  • 此外,您过早地转换结果,因此即使您除以浮点数/双精度数,结果也会被四舍五入。

明白我的意思 - 你可以安全地从你的代码中删除转换为 int ,它无论如何都会编译。这意味着您的最终数字是一个 int,并且由于您之前没有进行任何强制转换,这意味着您在代码中很早就丢失了十进制信息。

这是一个可能的修复:

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中杀死你的计时器。让定时器和线程像这样不受管理是不好的形式,并且可能导致奇怪的错误。
  • 不要使用“幻数”。将所有常量值放在静态最终类成员中,就像我在示例中所做的那样。当您决定更改这些值时,这将为您省去很多麻烦。

编辑:至于为什么你的进度条没有完成,那是因为onTick方法的工作方式与你可能假设的有点不同。要了解我的意思,请添加:

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

到你的onTick方法。这些值显然不会倒数到 0(因此在 dtotal 的情况下为 100,它是从 millisUntilFinished 派生的) - 您必须对此进行补偿。

于 2012-04-21T09:25:57.840 回答