2013-07-02 7 views
8

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?

+0

haben Sie versucht, so weit? – Yup

+0

Hier ist ein Beispiel http://thegeekyland.blogspot.com/2014/07/android-count-down-timer-in-actionbar.html – Arlind

Antwort

14

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; 
} 
+0

Vielen Dank Matt! Es funktioniert perfekt! – madx

+0

NullPointerException bei TimerText.setText(); –

2

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; 

} 
+0

richtige Antwort ... –

0

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 :)