Android - Получить время хронометр виджет

голоса
43

Как получить время от хронометра? Я попытался 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();
Задан 08/02/2009 в 23:23
источник пользователем
На других языках...                            


7 ответов

голоса
96

Если вы посмотрите на исходный код класса хронометр, вы увидите, что он не хранит прошедшее время в поле и он вычисляет его внутренне каждый раз, когда ему необходимо для обновления дисплея.

Однако это относительно легко сделать то же самое в своем коде:

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

Одна несколько запутанной вещь хронометра, что вы не можете использовать его в качестве секундомера , который запускается, останавливается и перезапускается снова. Когда он работает, он всегда будет показывать время , прошедшее с момента последнего сброса не его, независимо от того , сколько раз и как долго вы остановили его в то же время . Когда он останавливается, он просто прекращает обновление дисплея.

Если вам нужно что - то вроде секундомера вы будете иметь подкласс хронометра или , возможно , создать свою собственную версию с помощью источника .

альтернативный текст

Ответил 08/02/2009 в 23:59
источник пользователем

голоса
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();
    }
  };
Ответил 18/08/2009 в 01:42
источник пользователем

голоса
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
Ответил 07/04/2011 в 10:22
источник пользователем

голоса
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 (запуск и остановка)

Ответил 22/12/2011 в 09:53
источник пользователем

голоса
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 () дает общее истекшее время в секундах (мое приложение является своего рода секундомером, так что вы можете сделать паузу и возобновить его).

Надеюсь, поможет.

Ответил 24/12/2013 в 04:40
источник пользователем

голоса
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();
        }
    };
}
Ответил 07/05/2012 в 10:55
источник пользователем

голоса
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();
            }
        }
    });
Ответил 11/11/2011 в 05:29
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more