Ich möchte, dass ein einfacher mm: ss-Timer auf meiner Aktionsleiste angezeigt wird, in der Lage sein soll, die Anzahl der Minuten auszuwählen, von der aus gezählt werden soll, und dann eine Methode aufrufen, sobald sie auf 0 steht. Ist das möglich und wie? Vielen DankIst es möglich, einen Timer für die Actionbar auf Android hinzuzufügen?
Antwort
Ich habe es geschafft, indem Sie eine TextView
zu der Aktionsleiste als Action View im Menü hinzufügen, dann aktualisiert es in regelmäßigen Abständen mit einem CountDownTimer
.
(Getestet auf einem Android 3.0-Emulator, einem Android 4.3-Emulator und einem echten Gerät mit Android 4.3).
Hier ist die XML für den Menüpunkt. Beachten Sie, dass actionViewClass="android.widget.TextVew"
(showAsAction und actionViewClass nicht den Androiden-Namespace haben, da ich die Unterstützungsaktionsleiste verwende).
<?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>
In onCreateOptionsMenu
finde ich die MenuItem
und getActionView
nennen es TextView
an private zuweisen, timerText
. Ich wende hier auch etwas Polsterung an, so dass es am Rand des Bildschirms nicht richtig ist.
@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;
}
Ich habe eine Methode namens startTimer
ein CountDownTimer
zu starten und aktualisiert timerText
in seinem onTick
. Ich rufe startTimer
von onCreateOptionsMenu
, um sicherzustellen, dass auf timerText
nicht zugegriffen wird, bevor es initialisiert wurde. (Zuvor rief ich startTimer
von onCreate
an, bekam aber eine 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();
}
Ich bin sicher, dass jemand dies lesen, einen besseren Weg weiß eine ganze Anzahl von Sekunden zu einem Timecode wie „00:00:00“, aber nur für den Fall konvertieren werde ich die secondsToString
teilen Methode ich in onTick
, oben verwendet.
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;
}
Vielen Dank Matt! Es funktioniert perfekt! – madx
NullPointerException bei TimerText.setText(); –
Menü xml
<item
android:id="@+id/counter"
android:title=""
android:showAsAction="always">
</item>
** public boolean onCreateOptionsMenu (Menü-Menü)“
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;
}
richtige Antwort ... –
Ja, es ist möglich, Timer in Symbolleiste Aktion Verwendung dieser Code in Java hinzufügen :
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();
}
und auch Menü Datei definiert Timer-ID verwenden, wie diese
wenn mehr die youtube Besuch lernen :)
haben Sie versucht, so weit? – Yup
Hier ist ein Beispiel http://thegeekyland.blogspot.com/2014/07/android-count-down-timer-in-actionbar.html – Arlind