Java Android倒数计时器到目前为止
我正在尝试为android中的游戏/约会制作一个倒计时计时器。我想创建一个计时器,显示我用最终变量指定的日期前的天、小时、分钟和秒。计时器然后设置文本视图,向用户显示天、小时、分钟和秒Java Android倒数计时器到目前为止,java,android,eclipse,android-layout,android-intent,Java,Android,Eclipse,Android Layout,Android Intent,我正在尝试为android中的游戏/约会制作一个倒计时计时器。我想创建一个计时器,显示我用最终变量指定的日期前的天、小时、分钟和秒。计时器然后设置文本视图,向用户显示天、小时、分钟和秒 有没有关于如何编写代码的建议?看看这篇文章,我想它会帮助你: 使用java.util.Calendar类,我认为您应该能够了解如何完成其余的工作 --您可以使用getDate()、getHours()、getMinutes()、getSeconds()等。。。希望有帮助 这是一个Android内置的倒计时程序,它
有没有关于如何编写代码的建议?看看这篇文章,我想它会帮助你: 使用java.util.Calendar类,我认为您应该能够了解如何完成其余的工作
--您可以使用getDate()、getHours()、getMinutes()、getSeconds()等。。。希望有帮助 这是一个Android内置的倒计时程序,它将在文本视图中显示格式化为天、小时、分钟和秒的时间:
public class Example extends Activity {
CountDownTimer mCountDownTimer;
long mInitialTime = DateUtils.DAY_IN_MILLIS * 2 +
DateUtils.HOUR_IN_MILLIS * 9 +
DateUtils.MINUTE_IN_MILLIS * 3 +
DateUtils.SECOND_IN_MILLIS * 42;
TextView mTextView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTextView = (TextView) findViewById(R.id.empty);
mCountDownTimer = new CountDownTimer(mInitialTime, 1000) {
StringBuilder time = new StringBuilder();
@Override
public void onFinish() {
mTextView.setText(DateUtils.formatElapsedTime(0));
//mTextView.setText("Times Up!");
}
@Override
public void onTick(long millisUntilFinished) {
time.setLength(0);
// Use days if appropriate
if(millisUntilFinished > DateUtils.DAY_IN_MILLIS) {
long count = millisUntilFinished / DateUtils.DAY_IN_MILLIS;
if(count > 1)
time.append(count).append(" days ");
else
time.append(count).append(" day ");
millisUntilFinished %= DateUtils.DAY_IN_MILLIS;
}
time.append(DateUtils.formatElapsedTime(Math.round(millisUntilFinished / 1000d)));
mTextView.setText(time.toString());
}
}.start();
}
}
倒数计时器,将显示格式为小时、分钟、天和秒的时间
public class DemotimerActivity extends Activity {
/** Called when the activity is first created. */
TextView tv;
long diff;
long oldLong;
long NewLong;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tv = new TextView(this);
this.setContentView(tv);
SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
String oldTime = "19.02.2018, 12:00";//Timer date 1
String NewTime = "20.02.2018, 14:00";//Timer date 2
Date oldDate, newDate;
try {
oldDate = formatter.parse(oldTime);
newDate = formatter.parse(NewTime);
oldLong = oldDate.getTime();
NewLong = newDate.getTime();
diff = NewLong - oldLong;
} catch (ParseException e) {
e.printStackTrace();
}
MyCount counter = new MyCount(diff, 1000);
counter.start();
}
// countdowntimer is an abstract class, so extend it and fill in methods
public class MyCount extends CountDownTimer {
MyCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
txtNumber1.setText("done!");
}
@Override
public void onTick(long millisUntilFinished) {
long millis = millisUntilFinished;
String hms = (TimeUnit.MILLISECONDS.toDays(millis)) + "Day "
+ (TimeUnit.MILLISECONDS.toHours(millis) - TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(millis)) + ":")
+ (TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)) + ":"
+ (TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis))));
txtNumber1.setText(/*context.getString(R.string.ends_in) + " " +*/ hms);
}
}
}
试试这个:
SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy, HH:mm:ss");
formatter.setLenient(false);
String endTime = "25.06.2017, 15:05:36"
Date endDate;
try {
endDate = formatter.parse(endTime);
milliseconds = endDate.getTime();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
startTime = System.currentTimeMillis();
diff = milliseconds - startTime;
mCountDownTimer = new CountDownTimer(milliseconds, 1000) {
@Override
public void onTick(long millisUntilFinished) {
startTime=startTime-1;
Long serverUptimeSeconds =
(millisUntilFinished - startTime) / 1000;
String daysLeft = String.format("%d", serverUptimeSeconds / 86400);
txtViewDays.setText(daysLeft);
String hoursLeft = String.format("%d", (serverUptimeSeconds % 86400) / 3600);
txtViewHours.setText(hoursLeft);
String minutesLeft = String.format("%d", ((serverUptimeSeconds % 86400) % 3600) / 60);
txtViewMinutes.setText(minutesLeft);
String secondsLeft = String.format("%d", ((serverUptimeSeconds % 86400) % 3600) % 60);
txtViewSecond.setText(secondsLeft);
}
@Override
public void onFinish() {
}
}.start();
}
长启动时间代码>
private void start_countdown_timer()
{
SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy, HH:mm:ss");
formatter.setLenient(false);
String endTime = "18.09.2017, 15:05:36";
long milliseconds=0;
final CountDownTimer mCountDownTimer;
Date endDate;
try {
endDate = formatter.parse(endTime);
milliseconds = endDate.getTime();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
startTime = System.currentTimeMillis();
mCountDownTimer = new CountDownTimer(milliseconds, 1000) {
@Override
public void onTick(long millisUntilFinished) {
startTime=startTime-1;
Long serverUptimeSeconds =
(millisUntilFinished - startTime) / 1000;
String daysLeft = String.format("%d", serverUptimeSeconds / 86400);
//txtViewDays.setText(daysLeft);
Log.d("daysLeft",daysLeft);
String hoursLeft = String.format("%d", (serverUptimeSeconds % 86400) / 3600);
//txtViewHours.setText(hoursLeft);
Log.d("hoursLeft",hoursLeft);
String minutesLeft = String.format("%d", ((serverUptimeSeconds % 86400) % 3600) / 60);
//txtViewMinutes.setText(minutesLeft);
Log.d("minutesLeft",minutesLeft);
String secondsLeft = String.format("%d", ((serverUptimeSeconds % 86400) % 3600) % 60);
//txtViewSecond.setText(secondsLeft);
Log.d("secondsLeft",secondsLeft);
}
@Override
public void onFinish() {
}
}.start();
}
我已经阅读了你的问题,我已经面临这个问题,我没有使用任何第三方库为它定制代码
下面是代码:
public class CountDownTimerDaysActivity extends AppCompatActivity {
/*Views declaration*/
private TextView months_left,weeks_left,daysLeft,hrsLeft,minLeft,secLeft,endDate;
/*Handler Declaration*/
private Handler handler;
/*set End Time for timer */
private String endDateTime="2019-03-21 10:15:00";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*inflate layout for activity*/
setContentView(R.layout.activity_count_down_timer);
/*invoke initView method for views*/
initView();
}
/*initView method for findviews by id*/
private void initView() {
months_left = findViewById(R.id.months_left);
weeks_left = findViewById(R.id.weeks_left);
daysLeft = findViewById(R.id.days_left);
hrsLeft = findViewById(R.id.hrs_left);
minLeft = findViewById(R.id.min_left);
secLeft = findViewById(R.id.sec_left);
endDate = findViewById(R.id.end_date);
endDate.setText(endDateTime);
/*invoke countDownStart() method for start count down*/
countDownStart();
}
/*countDownStart() method for start count down*/
public void countDownStart() {
handler = new Handler();
Runnable runnable = new Runnable() {
@SuppressLint("SetTextI18n")
@Override
public void run() {
handler.postDelayed(this, 1000);
try {
@SuppressLint("SimpleDateFormat") SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
// Please set date in YYYY-MM-DD hh:mm:ss format
/*parse endDateTime in future date*/
Date futureDate = dateFormat.parse(endDateTime);
Date currentDate = new Date();
/*if current date is not comes after future date*/
if (!currentDate.after(futureDate)) {
long diff = futureDate.getTime()
- currentDate.getTime();
long days = diff / (24 * 60 * 60 * 1000);
diff -= days *(24 *60 * 60 *1000);
long hours = diff / (60 * 60* 1000);
diff -= hours * (60* 60 * 1000);
long minutes = diff / (60 * 1000);
diff -= minutes * (60 *1000);
long seconds = diff / 1000;
@SuppressLint("DefaultLocale") String dayLeft = "" + String.format("%02d", days);
@SuppressLint("DefaultLocale") String hrLeft = "" + String.format("%02d", hours);
@SuppressLint("DefaultLocale") String minsLeft = "" + String.format("%02d", minutes);
@SuppressLint("DefaultLocale") String secondLeft = "" + String.format("%02d", seconds);
daysLeft.setText(dayLeft + "D: ");
hrsLeft.setText(hrLeft + "H: ");
minLeft.setText(minsLeft + "M: ");
secLeft.setText(secondLeft + "S");
} else {
textViewGone();
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
handler.postDelayed(runnable, 1000);
}
private void textViewGone() {
months_left.setVisibility(View.GONE);
weeks_left.setVisibility(View.GONE);
daysLeft.setVisibility(View.GONE);
hrsLeft.setVisibility(View.GONE);
minLeft.setVisibility(View.GONE);
secLeft.setVisibility(View.GONE);
}
}
我希望它对你有用这也是kotlin的一个例子
fun printDifferenceDateForHours() {
val currentTime = Calendar.getInstance().time
val endDateDay = "03/02/2020 21:00:00"
val format1 = SimpleDateFormat("dd/MM/yyyy hh:mm:ss",Locale.getDefault())
val endDate = format1.parse(endDateDay)
//milliseconds
var different = endDate.time - currentTime.time
countDownTimer = object : CountDownTimer(different, 1000) {
override fun onTick(millisUntilFinished: Long) {
var diff = millisUntilFinished
val secondsInMilli: Long = 1000
val minutesInMilli = secondsInMilli * 60
val hoursInMilli = minutesInMilli * 60
val daysInMilli = hoursInMilli * 24
val elapsedDays = diff / daysInMilli
diff %= daysInMilli
val elapsedHours = diff / hoursInMilli
diff %= hoursInMilli
val elapsedMinutes = diff / minutesInMilli
diff %= minutesInMilli
val elapsedSeconds = diff / secondsInMilli
txt_timeleft.text = "$elapsedDays days $elapsedHours hs $elapsedMinutes min $elapsedSeconds sec"
}
override fun onFinish() {
txt_timeleft.text = "done!"
}
}.start()
}
天数为+1,是否可以减少?此方法在我的模拟器上每分钟最多跳过3秒。它不是在我的手机上做的。这是仿真器的问题,还是应该在其他手机上发生?如果您选择将月份添加到这一点,该怎么办?它实际上会增加时间计数器,而不是下降计数器。此内部类可能比包含活动的时间长(如果您在计时器完成之前离开该活动),从而导致内存泄漏。一定要取消计时器并删除暂停或停止时的任何引用。非常完美,这就是我要找的。请不要教年轻人使用过时且臭名昭著的SimpleDateFormat
类。至少不是第一个选择。而且不是毫无保留的。今天,我们在及其DateTimeFormatter
中有了更好的功能。是的,你可以在Android上使用它。对于较老的Android,请参见。麻烦?SimpleDateFormat很麻烦吗?如果我不想要几天,而只需要几小时、几分钟和几秒钟呢?