12

シンプルなmm:ssタイマーをアクションバーに表示し、カウントダウンを開始する分数を選択して、0 になったらメソッドを呼び出すことができるようにしたいと思います。これは可能ですか?

4

3 に答える 3

16

メニューのアクション ビューTextViewとしてアクション バーに を追加し、 . (Android 3.0 エミュレーター、Android 4.3 エミュレーター、および Android 4.3 を実行する実際のデバイスでテスト済み)。CountDownTimer

メニュー項目の XML は次のとおりです。(サポート アクション バーを使用しているため、 showAsActionactionViewClass="android.widget.TextVew"
と 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>

で、それを privateに割り当てるためのand 呼び出しonCreateOptionsMenuを見つけました。画面の端にならないように、ここにもパディングを適用します。MenuItemgetActionViewTextViewtimerText

@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を更新するために呼び出されるメソッドがあります。から呼び出して、初期化される前にアクセスされないようにします。(以前、 から電話しましたが、 を受け取りました)。timerTextonTickstartTimeronCreateOptionsMenutimerTextstartTimeronCreateNullPointerException

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;
}
于 2014-01-08T15:35:22.533 に答える