Я хотел бы, чтобы на моем рабочем столе отображался простой таймер: ss, можно выбрать количество минут, чтобы начать отсчет, а затем вызвать метод, когда он равен 0. Возможно ли это и как? СпасибоМожно ли добавить таймер в панель действий на Android?
ответ
Мне удалось это сделать, добавив TextView
в панель действий в качестве Action View в меню, а затем регулярно обновляя его с помощью CountDownTimer
.
(протестирован на эмулятор Android 3.0, эмулятор Android 4.3 и реальное устройство под управлением Android 4.3).
Вот XML для пункта меню. Обратите внимание, что actionViewClass="android.widget.TextVew"
(showAsAction и actionViewClass не имеют пространства имен android, потому что я использую панель действий поддержки).
<?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>
В onCreateOptionsMenu
, я считаю MenuItem
и вызвать getActionView
присвоить его частным TextView
, timerText
. Я также применяю здесь некоторые дополнения, так что это не так на краю экрана.
@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;
}
У меня есть метод, называемый startTimer
начать CountDownTimer
и обновить timerText
в onTick
. Я звоню startTimer
от onCreateOptionsMenu
, чтобы гарантировать, что timerText
не доступен, прежде чем он будет инициализирован. (Раньше я звонил startTimer
от onCreate
, но получил 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();
}
Я уверен, что каждый, кто читает это будет знать, лучший способ, чтобы преобразовать целое число секунд до таймкодом, таких как «00:00:00», но только в том случае, если я поделюсь secondsToString
метод, который я использовал в onTick
, выше.
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;
}
Спасибо, Мэтт! Он отлично работает! – madx
NullPointerException в timerText.setText(); –
меню XML
<item
android:id="@+id/counter"
android:title=""
android:showAsAction="always">
</item>
** общественное логическое onCreateOptionsMenu (меню 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;
}
правильный ответ ... –
Да, это возможно, чтобы добавить таймер в действии на панели инструментов использовать этот код в 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();
}
, а также использовать меню файл определен идентификатор таймера, как эта
если узнать больше визита YouTube :)
вы пробовали до сих пор? – Yup
Вот пример http://thegeekyland.blogspot.com/2014/07/android-count-down-timer-in-actionbar.html – Arlind