Android - Получить время виджета хронометра
Как получить время с хронометра? Я попробовал 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();
Ответы
Ответ 1
Если вы посмотрите на источник класса 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();
}
};
}
Одна довольно запутанная вещь о хронометре заключается в том, что вы не можете использовать ее в качестве секундомера, который запускается, останавливается и снова запускается. Когда он будет работать, он всегда будет показывать время, прошедшее с момента последнего reset, независимо от того, сколько раз и сколько времени вы остановили его в это время. Когда он остановлен, он просто перестает обновлять дисплей.
Если вам нужно что-то вроде секундомера, вам придется подклассировать хронометр или создать собственную версию, используя источник .
![alt text]()
Ответ 2
Я нашел этот пример действительно полезным, спасибо nyenyec!
Здесь мои два цента о том, как превратить его в настоящую функцию секундомера, без подкласса 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();
}
};
Ответ 3
@nyenyec +1: вот что я закончил с использованием ответа nyenyec без подкласса.
chronometer.setOnChronometerTickListener(new OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
long elapsedMillis = SystemClock.elapsedRealtime() - chronometer.getBase();
if(elapsedMillis>THRESHOLD){
doYourStuff();
}
}
});
где THRESHOLD
private static final int THRESHOLD_EXERSISE = 60000; //In milliseconds
Ответ 4
Мое решение:
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 (запуск и останов)
Ответ 5
Несколько поздний ответ, но я пытался решить это сам сегодня. Я просто разобрал текст представления:
// 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() дает вам общее время в секундах (мое приложение - это какой-то секундомер, поэтому вы можете приостановить его и возобновить).
Надеюсь, что это поможет.
Ответ 6
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();
}
}
});
Ответ 7
//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();
}
};
}