【问题标题】:Is it possible to add a timer to the actionbar on android?是否可以在android上的操作栏上添加一个计时器?
【发布时间】:2013-07-02 16:09:53
【问题描述】:

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

【问题讨论】:

标签: android android-actionbar countdowntimer


【解决方案1】:

我已经设法做到这一点,方法是在操作栏中添加 TextView 作为菜单中的 Action View,然后使用 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>

onCreateOptionsMenu 中,我找到MenuItem 并调用getActionView 将其分配给私人TextViewtimerText。我还在这里应用了一些填充,使其不在屏幕边缘。

@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 并在其onTick 中更新timerText。我从onCreateOptionsMenu 调用startTimer 以确保timerText 在初始化之前不会被访问。 (之前,我从onCreate 打电话给startTimer,但得到了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();
}

我相信阅读本文的任何人都会知道将整数秒数转换为时间码(例如“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;
}

【讨论】:

  • NullPointerException at timerText.setText();
【解决方案2】:

菜单 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;

 }

【讨论】:

    【解决方案3】:

    是的,可以在工具栏操作中添加计时器 在 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();
    }
    

    并且还使用 菜单文件定义定时器 id 就像这样

    如果了解更多信息,请访问 youtube :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多