尝试在我的应用中制作一个小倒数计时器,但它不起作用。
想法是倒数到特定的时间。首先是几天,当它接近时,按小时。
以下方法在我的Fragmentclass.java中(所以它是一个片段)
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onViewCreated(view, savedInstanceState);
Calendar cal = Calendar.getInstance();
cal.set(2012, 8, 29, 10, 0);
long endTime = cal.getTimeInMillis();
long currentTime = System.currentTimeMillis();
long remaining = currentTime - endTime;
long seconds = remaining / 1000 % 60;
new CountDownTimer(seconds, 1000) {
TextView tv = (TextView)getActivity().findViewById(R.id.introTimeLeft);
public void onTick(long millisUntilFinished) {
Calendar cal = Calendar.getInstance();
cal.set(2012, 8, 29, 10, 0);
long endTime = cal.getTimeInMillis();
long currentTime = System.currentTimeMillis();
long remaining = currentTime - endTime;
long hours = remaining / 3600000;
long mins = remaining / 60000 % 60;
long seconds = remaining / 1000 % 60;
long days = hours / 24;
String remainingText = String.valueOf(days) + " days";
Log.i("countdown",String.valueOf(days));
tv.setText("Days left: " + days);
}
public void onFinish() {
Log.i("countdown","CD Finished");
tv.setText("CD Finished!");
}
}.start();
}
请注意,文本框值目前仅用于测试,但我似乎无法显示倒计时。
这也是最好的方法吗?
答案 0 :(得分:2)
以下是运行代码时变量的值:
endTime = 1348902045437
currentTime = 1340645325437
remaining = -8256720000
seconds = 0
如您所见seconds == 0
,这就是原因。
另请注意,CountDownTimer(long millisInFuture, long countDownInterval)
constructor中的第一个参数是
从调用start()到将来的millis数量 完成倒计时并调用onFinish()。
所以固定代码是:
Calendar cal = Calendar.getInstance();
cal.set(2012, 8, 29, 10, 0);
long endTime = cal.getTimeInMillis();
long currentTime = System.currentTimeMillis();
long remaining = endTime - currentTime;
new CountDownTimer(remaining, 1000) {
...
<强>更新强>
奇怪的是它没有更新文本视图。我可以提出的唯一想法是在主UI线程上运行更新调用。它应该是这样的:
public void onTick(long millisUntilFinished) {
final String days = .. // some code to generate days
getActivity().runOnUiThread(new Runnable() {
public void run() {
tv.setText("Days left: " + days);
}
});
}
public void onFinish() {
Log.i("countdown","CD Finished");
getActivity().runOnUiThread(new Runnable() {
public void run() {
tv.setText("CD Finished!");
}
});
}
如果这没有帮助 - 那么我就没有想法了。