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

Android-获取计时小部件的时间,android,time,view,widget,chronometer,Android,Time,View,Widget,Chronometer,如何从计时表中获取时间?我尝试了getText、getFormat、getBase等,但它们都不起作用 示例代码段: 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

如何从计时表中获取时间?我尝试了getText、getFormat、getBase等,但它们都不起作用

示例代码段:

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();

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

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

long elapsedMillis = SystemClock.elapsedRealtime() - chronometerInstance.getBase();
这假设您已启动时钟,如下所示:

chronometerInstance.setBase(SystemClock.elapsedRealtime());
chronometerInstance.start();
下面是一个完整的示例:

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();
    }
};
}
关于计时表,有一点让人困惑,那个就是你们不能把它当作一个秒表,可以启动,停止,再重新启动。当它运行时,它将始终显示自您上次重置它以来经过的时间,无论您在此期间停止了多少次和多长时间。当它停止时,它只是停止更新显示

如果你需要像秒表这样的东西,你就必须对计时表进行子类化,或者可能使用创建自己的版本


我发现这个例子非常有用,谢谢Nyenc

这是我的两分钱,关于如何把它变成一个真正的秒表功能,而不把它细分为计时器。只需更改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();
    }
  };

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

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

private static final int THRESHOLD_EXERSISE = 60000; //In milliseconds
我的解决方案:

    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();
    }
}
在onCreate中:

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

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

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

    // 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);
}
//需要格式为MM:SS或HH:MM:SS的字符串
公共静态int getSecondsFromDurationString(字符串值){
String[]parts=value.split(“:”);
//格式错误,对您没有价值。
如果(parts.length<2 | | parts.length>3)
返回0;
整数秒=0,分钟=0,小时=0;
如果(parts.length==2){
秒=整数.parseInt(部分[1]);
分钟=整数.parseInt(部分[0]);
}
否则如果(parts.length==3){
秒=整数.parseInt(部分[2]);
分钟=整数.parseInt(部分[1]);
小时=整数.parseInt(部分[0]);
}
返回秒+(分*60)+(小时*3600);
}
因此,通过view.getText().toString()调用getSecondsFromDurationString可以获得以秒为单位的总运行时间(我的应用程序是一种秒表,因此可以暂停并恢复)


希望能有帮助。

你好,谢谢,但我无法让它工作-我每次尝试时都会得到一个(似乎)介于1和50之间的随机数。谢谢,这应该是一件容易修复的事情。你能发布一段代码片段吗?@nyec你能回答如何获得时间并安排其他活动吗?THX在此服务器上找不到请求的URL/codesearch/p。我们只知道这些。谢谢你的回答。我曾经解决过这个问题:欢迎使用堆栈溢出!虽然这在理论上可以回答这个问题,但最好也包括解释。天文钟现在支持
getText()
//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();
        }
    };
}
    // 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);
}