Tôi muốn một bộ đếm thời gian mm: ss đơn giản được hiển thị trên thanh tác vụ của tôi, có thể chọn số phút để bắt đầu đếm ngược và sau đó gọi phương thức khi nó ở mức 0. Có thể làm như thế không? Cảm ơn bạnCó thể thêm bộ hẹn giờ vào thanh tác vụ trên Android không?
Trả lời
Tôi đã quản lý để làm điều đó bằng cách thêm TextView
vào Thanh tác vụ dưới dạng Action View trong menu, sau đó cập nhật nó theo khoảng thời gian đều đặn bằng cách sử dụng CountDownTimer
.
(Được thử nghiệm trên trình giả lập Android 3.0, trình giả lập Android 4.3 và thiết bị thực chạy Android 4.3).
Đây là XML cho mục menu. Lưu ý rằng actionViewClass="android.widget.TextVew"
(showAsAction và actionViewClass không có vùng tên android vì tôi đang sử dụng thanh tác vụ hỗ trợ).
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:compatibility="http://schemas.android.com/apk/res-auto" >
<item android:id="@+id/break_timer"
android:title="@string/break_timer_title"
compatibility:showAsAction="always"
compatibility:actionViewClass="android.widget.TextView" />
</menu>
Trong onCreateOptionsMenu
, tôi tìm ra MenuItem
và gọi getActionView
để gán nó vào tin TextView
, timerText
. Tôi cũng áp dụng một số đệm ở đây, để nó không phải ở cạnh của màn hình.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.break_timer, menu);
MenuItem timerItem = menu.findItem(R.id.break_timer);
timerText = (TextView) MenuItemCompat.getActionView(timerItem);
timerText.setPadding(10, 0, 10, 0); //Or something like that...
startTimer(30000, 1000); //One tick every second for 30 seconds
return true;
}
Tôi có một phương pháp gọi là startTimer
để bắt đầu một CountDownTimer
và cập nhật timerText
trong onTick
của nó. Tôi gọi startTimer
từ onCreateOptionsMenu
để đảm bảo rằng timerText
không được truy cập trước khi nó được khởi tạo. (Trước đây, tôi gọi là startTimer
từ onCreate
, nhưng có số NullPointerException
).
private void startTimer(long duration, long interval) {
CountDownTimer timer = new CountDownTimer(duration, interval) {
@Override
public void onFinish() {
//TODO Whatever's meant to happen when it finishes
}
@Override
public void onTick(long millisecondsLeft) {
int secondsLeft = (int) Math.round((millisecondsLeft/(double) 1000));
timerText.setText(secondsToString(secondsLeft));
}
};
timer.start();
}
Tôi chắc chắn rằng bất cứ ai đọc bài viết này sẽ biết một cách tốt hơn để chuyển đổi một số nguyên giây để một timecode như "00:00:00", nhưng chỉ trong trường hợp tôi sẽ chia sẻ những secondsToString
phương pháp tôi đã sử dụng trong onTick
, ở trên.
private String secondsToString(int improperSeconds) {
//Seconds must be fewer than are in a day
Time secConverter = new Time();
secConverter.hour = 0;
secConverter.minute = 0;
secConverter.second = 0;
secConverter.second = improperSeconds;
secConverter.normalize(true);
String hours = String.valueOf(secConverter.hour);
String minutes = String.valueOf(secConverter.minute);
String seconds = String.valueOf(secConverter.second);
if (seconds.length() < 2) {
seconds = "0" + seconds;
}
if (minutes.length() < 2) {
minutes = "0" + minutes;
}
if (hours.length() < 2) {
hours = "0" + hours;
}
String timeString = hours + ":" + minutes + ":" + seconds;
return timeString;
}
Cảm ơn bạn Matt! Nó hoạt động hoàn hảo! – madx
NullPointerException tại timerText.setText(); –
menu xml
<item
android:id="@+id/counter"
android:title=""
android:showAsAction="always">
</item>
public boolean ** onCreateOptionsMenu (Menu menu)"
long timer = 10000;
public Boolean onCreateOptionsMenu(Menu menu)
{
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.menu, menu);
final MenuItem counter = menu.findItem(R.id.counter);
new CountDownTimer(timer, 1000) {
public void onTick(long millisUntilFinished) {
long millis = millisUntilFinished;
String hms = (TimeUnit.MILLISECONDS.toHours(millis))+":"+(TimeUnit.MILLISECONDS.toMinutes(millis) -TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)))+":"+ (TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
counter.setTitle(hms);
timer = millis;
}
public void onFinish() {
counter.setTitle("done!");
}
}.start();
return true;
}
câu trả lời đúng ... –
Có nó có thể để thêm hẹn giờ trong hành động toolbar sử dụng mã này trong Java :
private void startTimer(long duration, long interval) {
CountDownTimer timer = new CountDownTimer(duration, interval) {
@Override
public void onFinish() {
//TODO Whatever's meant to happen when it finishes
}
@Override
public void onTick(long millisecondsLeft) {
int secondsLeft = (int) Math.round((millisecondsLeft/(double) 1000));
timerText.setText(secondsToString(secondsLeft));
}
};
timer.start();
}
và cũng sử dụng menu file định nghĩa timer id chỉ như thế này
nếu tìm hiểu thêm chuyến thăm youtube :)
Bạn đã thử cho đến nay? – Yup
Đây là một ví dụ http://thegeekyland.blogspot.com/2014/07/android-count-down-timer-in-actionbar.html – Arlind