2009-02-08 17 views
40

如何从计时表中获取时间?我尝试过getText,getFormat,getBase等,但他们都不能工作。Android - 获取计时表部件的时间

示例代码片段:

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

**天文台**现在支持`getText()` – gnB 2017-08-11 00:07:33

回答

94

如果你看看天文台类的源代码,你会看到,它不经过时间存储在一个领域,它的每一次内部计算它,它需要更新显示。

但是它是比较容易做同样在自己的代码:

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

天文台一个有点令人困惑的事情是,你不能真正使用它作为开始,停止并重新启动的秒表。当它运行时,它将始终显示自上次重置之后所经过的时间,无论多少次,以及您在此期间停止了多长时间,都会显示。停止时,只停止更新显示。

如果你需要类似秒表的东西,你将不得不继承Chronometer或者使用source创建你自己的版本。

alt text

+0

你好, 谢谢,但我不能得到它的工作 - 当我尝试时,我总是得到一个(看似)1至50之间的随机数。 谢谢,艾萨克 – 2009-02-08 23:11:02

+0

它应该是一件容易的事情来解决。你能发布一个代码片段吗? – nyenyec 2009-02-08 23:46:08

+0

我发布了一段代码 - 谢谢。 – 2009-02-11 02:21:40

11

我发现这个例子中真正有用的,感谢nyenyec!

这是我的两分钱如何将它变成一个真正的秒表功能,没有亚类天文台。只要改变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(); 
    } 
    }; 
3

@ 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 
0
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(); 
      } 
     } 
    }); 
2

我的解决方案:

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所法两个按钮(启动和停止)

0
//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(); 
     } 
    }; 
} 
1

有些晚回应,但我今天要解决这个自己。最后我只是解析视图的文本。)

// 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); 
} 

所以调用getSecondsFromDurationString与view.getText()的toString(让你在几秒钟内的总时间(我的应用程序是某种驻足观看,所以你可以暂停并恢复)。

希望它有帮助。