2013-07-02 21 views
8

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?

+0

Bạn đã thử cho đến nay? – Yup

+0

Đây là một ví dụ http://thegeekyland.blogspot.com/2014/07/android-count-down-timer-in-actionbar.html – Arlind

Trả lời

14

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

Cảm ơn bạn Matt! Nó hoạt động hoàn hảo! – madx

+0

NullPointerException tại timerText.setText(); –

2

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; 

} 
+0

câu trả lời đúng ... –

0

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