Android - 获取计时器小部件的时间

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/526524/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 02:15:21  来源:igfitidea点击:

Android - Get time of chronometer widget

androidtimeviewwidgetchronometer

提问by Isaac Waller

How to get the time from a Chronometer? I tried getText, getFormat, getBase, etc, but none of them could work.

如何从天文台获取时间?我尝试了 getText、getFormat、getBase 等,但它们都不起作用。

Example code snippet:

示例代码片段:

Chronometer t = (Chronometer)findViewById(R.id.toptime);
long time = SystemClock.elapsedRealtime()-t.getBase();
Log.d(null,"Was: "+time); //time is not the proper time for some reason - it is a random number between 0 and 50
t.setBase(SystemClock.elapsedRealtime());
t.start();

回答by nyenyec

If you look at the source of the Chronometer class, you'll see that it doesn't store the elapsed time in a field and it calculates it internally every time it needs to update the display.

如果您查看 Chronometer 类的源代码,您会发现它不会将经过时间存储在字段中,而是在每次需要更新显示时在内部进行计算。

However it's relatively easy to do the same in your own code:

但是,在您自己的代码中执行相同操作相对容易:

long elapsedMillis = SystemClock.elapsedRealtime() - chronometerInstance.getBase();

This assumes that you have started your clock something like this:

这假设你已经开始了你的时钟是这样的:

chronometerInstance.setBase(SystemClock.elapsedRealtime());
chronometerInstance.start();

Here's a full example:

这是一个完整的例子:

public class ChronoExample extends Activity {
Chronometer mChronometer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);

    mChronometer = new Chronometer(this);
    layout.addView(mChronometer);

    Button startButton = new Button(this);
    startButton.setText("Start");
    startButton.setOnClickListener(mStartListener);
    layout.addView(startButton);

    Button stopButton = new Button(this);
    stopButton.setText("Stop");
    stopButton.setOnClickListener(mStopListener);
    layout.addView(stopButton);

    Button resetButton = new Button(this);
    resetButton.setText("Reset");
    resetButton.setOnClickListener(mResetListener);
    layout.addView(resetButton);        

    setContentView(layout);
}

private void showElapsedTime() {
    long elapsedMillis = SystemClock.elapsedRealtime() - mChronometer.getBase();            
    Toast.makeText(ChronoExample.this, "Elapsed milliseconds: " + elapsedMillis, 
            Toast.LENGTH_SHORT).show();
}

View.OnClickListener mStartListener = new OnClickListener() {
    public void onClick(View v) {
        mChronometer.start();
        showElapsedTime();
    }
};

View.OnClickListener mStopListener = new OnClickListener() {
    public void onClick(View v) {
        mChronometer.stop();
        showElapsedTime();
    }
};

View.OnClickListener mResetListener = new OnClickListener() {
    public void onClick(View v) {
        mChronometer.setBase(SystemClock.elapsedRealtime());
        showElapsedTime();
    }
};
}

One somewhat confusing thing about Chronometer is that you can't really use it as a stopwatch that gets started, stopped and restarted again. When it's running, it will always show the time elapsed since you last reset it, no matter how many times and for how long you have stopped it in the meantime. When it is stopped, it simply stops updating the display.

关于 Chronometer 的一个有点令人困惑的事情是,你不能真正将它用作启动、停止和重新启动的秒表。当它运行时,它将始终显示自上次重置以来经过的时间,无论您在此期间停止了多少次和多长时间。当它停止时,它只是停止更新显示。

If you need something like a stopwatch you'll have to subclass Chronometer or maybe create your own version using the source.

如果你需要像秒表这样的东西,你必须继承 Chronometer 或者使用source创建你自己的版本。

alt text

替代文字

回答by Isaac Waller

I found this example really useful, thanks nyenyec!

我发现这个例子真的很有用,谢谢 nyenyec!

Here's my two cents on how to turn it into a real stopwatch function, without subclassing Chronometer. Just change the mStartListener method to parse the text from mChronometer (it's derived from TextView after all), calculate milliseconds, and use setBase() to readjust the base time to that amount of time in the past:

这是我关于如何在不继承 Chronometer 的情况下将其变成真正的秒表功能的两分钱。只需更改 mStartListener 方法以解析来自 mChronometer 的文本(毕竟它是从 TextView 派生的),计算毫秒,并使用 setBase() 将基准时间重新调整为过去的时间量:

  View.OnClickListener mStartListener = new OnClickListener() {
    public void onClick(View v) {

      int stoppedMilliseconds = 0;

      String chronoText = mChronometer.getText().toString();
      String array[] = chronoText.split(":");
      if (array.length == 2) {
        stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 1000
            + Integer.parseInt(array[1]) * 1000;
      } else if (array.length == 3) {
        stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 60 * 1000 
            + Integer.parseInt(array[1]) * 60 * 1000
            + Integer.parseInt(array[2]) * 1000;
      }

      mChronometer.setBase(SystemClock.elapsedRealtime() - stoppedMilliseconds);
      mChronometer.start();
    }
  };

回答by Samuel

@nyenyec +1: here is what i ended up with, while using nyenyec's response without a sub class.

@nyenyec +1:这是我最终得到的结果,同时使用 nyenyec 的响应而没有子类。

        chronometer.setOnChronometerTickListener(new OnChronometerTickListener() {                      
        @Override
        public void onChronometerTick(Chronometer chronometer) {
            long elapsedMillis = SystemClock.elapsedRealtime() - chronometer.getBase();
            if(elapsedMillis>THRESHOLD){
                doYourStuff();
            }
        }
    });

where THRESHOLD is

阈值在哪里

private static final int THRESHOLD_EXERSISE = 60000; //In milliseconds

回答by jeudyx

Somewhat late response, but I was trying to solve this myself today. I ended up just parsing the text of the view:

反应有点晚,但我今天试图自己解决这个问题。我最终只是解析了视图的文本:

    // Expects a string in the form MM:SS or HH:MM:SS
public static int getSecondsFromDurationString(String value){

    String [] parts = value.split(":");

    // Wrong format, no value for you.
    if(parts.length < 2 || parts.length > 3)
        return 0;

    int seconds = 0, minutes = 0, hours = 0;

    if(parts.length == 2){
        seconds = Integer.parseInt(parts[1]);
        minutes = Integer.parseInt(parts[0]);
    }
    else if(parts.length == 3){
        seconds = Integer.parseInt(parts[2]);
        minutes = Integer.parseInt(parts[1]);
        hours = Integer.parseInt(parts[0]);
    }

    return seconds + (minutes*60) + (hours*3600);
}

So calling getSecondsFromDurationString with view.getText().toString() gives you the total elapsed time in seconds (my application is some kind of stop watch, so you can pause it and resume it).

因此,使用 view.getText().toString() 调用 getSecondsFromDurationString 可以为您提供以秒为单位的总经过时间(我的应用程序是某种秒表,因此您可以暂停它并恢复它)。

Hope it helps.

希望能帮助到你。

回答by Dominik Benner

My Solution:

我的解决方案:

    public void starttimer(View view){
    Button mybtn = (Button) view;
    if (mybtn.equals(findViewById(R.id.button1))) {
        mycm.setBase(SystemClock.elapsedRealtime() - elapsed);
        mycm.start();
    }
    else {
        mycm.stop();
        elapsed = SystemClock.elapsedRealtime() -  mycm.getBase();
    }
}

In onCreate:

在 onCreate 中:

    mycm = (Chronometer) findViewById(R.id.chronometer1);
    elapsed = 0;

There are two buttons in the layout which both call the starttimer method (start and stop)

布局中有两个按钮,它们都调用了 starttimer 方法(开始和停止)

回答by Subash Basnet

//ok here is the final changed code which works well

import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.LinearLayout;
import android.widget.Toast;

public class HelloWidgetActivity extends Activity {
    Chronometer mChronometer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.VERTICAL);

        mChronometer = new Chronometer(this);
        layout.addView(mChronometer);

        Button startButton = new Button(this);
        startButton.setText("Start");
        startButton.setOnClickListener(mStartListener);
        layout.addView(startButton);

        Button stopButton = new Button(this);
        stopButton.setText("Stop");
        stopButton.setOnClickListener(mStopListener);
        layout.addView(stopButton);

        Button resetButton = new Button(this);
        resetButton.setText("Reset");
        resetButton.setOnClickListener(mResetListener);
        layout.addView(resetButton);

        setContentView(layout);
    }

    private void showElapsedTime() {
        long elapsedMillis = SystemClock.elapsedRealtime()
                - mChronometer.getBase();
        Toast.makeText(HelloWidgetActivity.this,
                "Elapsed milliseconds: " + elapsedMillis, Toast.LENGTH_SHORT).show();
    }



    View.OnClickListener mStartListener = new OnClickListener() {
        public void onClick(View v) {
          int stoppedMilliseconds = 0;
          String chronoText = mChronometer.getText().toString();
          String array[] = chronoText.split(":");
          if (array.length == 2) {
            stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 1000
                + Integer.parseInt(array[1]) * 1000;
          } else if (array.length == 3) {
            stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 60 * 1000 
                + Integer.parseInt(array[1]) * 60 * 1000
                + Integer.parseInt(array[2]) * 1000;
          }
          mChronometer.setBase(SystemClock.elapsedRealtime() - stoppedMilliseconds);
          mChronometer.start();
        }
      };

    View.OnClickListener mStopListener = new OnClickListener() {
        public void onClick(View v) {
            mChronometer.stop();
            showElapsedTime();
        }
    };

    View.OnClickListener mResetListener = new OnClickListener() {
        public void onClick(View v) {
            mChronometer.setBase(SystemClock.elapsedRealtime());
            mChronometer.stop();
            showElapsedTime();
        }
    };
}

回答by hoofuz

    final Chronometer counter = (Chronometer) findViewById(R.id.chronometer1);
    counter.setOnChronometerTickListener(new OnChronometerTickListener() {

        public void onChronometerTick(Chronometer chronometer) {
            // TODO Auto-generated method stub
            chronometer.refreshDrawableState();

        }
    });

    final ToggleButton togglebutton = (ToggleButton) findViewById(R.id.togglebutton1);
    togglebutton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            // Perform action on clicks
            if (togglebutton.isChecked()) {
                counter.start();
            } else {
                counter.stop();
            }
        }
    });