2013-07-02 10 views
8

単純なmm:ssタイマーをアクションバーに表示したい場合は、カウントダウンを開始する分数を選択してから、一度0になったらメソッドを呼び出すことができます。これは可能ですか?ありがとうございますアンドロイドのアクションバーにタイマーを追加することはできますか?

+0

は、あなたがこれまでに試したがある場合だけ、この

よう メニューファイル定義されたタイマーのIDを使用できますか? – Yup

+0

ここに例があります:http://thegeekyland.blogspot.com/2014/07/android-count-down-timer-in-actionbar.html – Arlind

答えて

14

TextViewをメニューにAction Viewとしてアクションバーに追加し、CountDownTimerを使用して定期的に更新しました。
(Android 3.0エミュレータ、Android 4.3エミュレータ、Android 4.3搭載の実デバイスでテスト済み)

ここにメニュー項目のXMLがあります。 actionViewClass="android.widget.TextVew"
(showAsActionおよびactionViewClassにはサポートアクションバーを使用しているため、アンドロイド名前空間はありません)に注意してください。 onCreateOptionsMenu

<?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> 

、私はMenuItemを見つけるとプライベートTextViewtimerTextに割り当てるgetActionViewを呼び出します。私はここでもいくつかのパディングを適用しているので、画面の端に正しく表示されません。

@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; 
} 

私はCountDownTimerを開始し、そのonTicktimerTextを更新するstartTimerと呼ばれる方法があります。私はstartTimerからonCreateOptionsMenuに電話をかけて、timerTextが初期化される前にアクセスされないようにします。 (これまでは、startTimeronCreateから呼び出しましたが、NullPointerExceptionがあります)。

私はこれを読んで、誰がこのような「午後12時00分○○秒」などのタイムコードに秒数を整数に変換するためのより良い方法を知っているだろうが、念のために、私は secondsToStringを共有するだろうと確信している
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(); 
} 

方法私は上記の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; 
} 
+0

ありがとう、マット!それは完全に動作します! – madx

+0

timerText.setText()でのNullPointerException; –

2

メニューXML

<item 
       android:id="@+id/counter" 
       android:title="" 
       android:showAsAction="always"> 
</item> 

**公共ブールonCreateOptionsMenu(メニューメニュー)」

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

正解... –

0

はい、それは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(); 
} 

とも詳細はこちら訪問ユーチューブ:)

関連する問題