是否可以在Android上的操作栏中添加计时器?

Oma*_*ani 8 countdowntimer android-actionbar

我想要一个简单的mm:ss计时器显示在我的操作栏上,能够选择开始倒计时的分钟数,然后一旦它在0时调用一个方法.这可能吗?如何?谢谢

小智 15

我已经设法通过TextView在操作栏中添加一个动作视图作为菜单中的动作视图,然后使用一个定期更新它CountDownTimer.
(在Android 3.0模拟器,Android 4.3模拟器和运行Android 4.3的真实设备上测试过).

这是菜单项的XML.请注意actionViewClass="android.widget.TextVew"
(showAsAction和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>
Run Code Online (Sandbox Code Playgroud)

onCreateOptionsMenu,我找到MenuItem并呼吁getActionView将其分配给私人TextView,timerText.我也在这里应用了一些填充,因此它不在屏幕的边缘.

@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;
}
Run Code Online (Sandbox Code Playgroud)

我有一个方法叫做startTimer启动CountDownTimer并更新timerText其中onTick.我打电话startTimeronCreateOptionsMenu以确保timerText它已被初始化之前不被访问.(以前,我叫startTimeronCreate,却得到了一个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();
}
Run Code Online (Sandbox Code Playgroud)

我确信任何阅读此内容的人都会知道将整数秒转换为时间码(如"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;
}
Run Code Online (Sandbox Code Playgroud)