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

Я добавил расширенную версию своего комментария в качестве ответа:

Ваш зритель использует CP1252 (английский и Западная Европа, также называемый ANSI в Windows) или CP1250 (Восточная Европа) или другая подобная кодовая страница. Большинство символов закодированы одинаково, только несколько изменений для конкретного языка. Ваш пример не включает символы, которые отличаются в двух кодировках, поэтому я не могу сказать точно.

Эти кодовые страницы используются в Microsoft Windows, и они основаны (но не на 100% совместимы) с Latin-1, поэтому обычно можно увидеть текст, интерпретируемый с такой кодировкой. MacO и Linux сильно (в настоящее время) в кодировке UTF-8. Windows использует Unicode для внутреннего использования (но UTF-16)

Старая кодировка, вероятно, CP437: стандартная кодовая страница в DOS, поэтому она часто использовалась также для файлов CSV. Другие часто используемые старые кодировки - это CP850 (Западная Европа) и CP852 (Центральная Европа).

Что касается других ответов, которые вы добавляете в комментарии, я думаю, вам следует обратиться к Superuser (если вы запрашиваете инструменты (некоторые редакторы позволяют указывать кодировку. Вы можете использовать браузер (открывая локальный файл): браузеры также позволяют выбрать локальную кодировку, и я думаю, что вы можете копировать как Unicode [не уверен], другие инструменты иногда имеют скрытую опцию для импорта файлов, но, возможно, не со всеми параметрами), или как новый вопрос на этом сайте, если вы хотите сделать это программно. Но поэтому вам необходимо указать язык. Python хорошо подходит для таких преобразований (большинство языков сценариев создаются для обработки текстов): в python встроено множество кодировок, вы должны просто указать при чтении и при написании Файлы .R также может быть указан на входной кодировке.

45
задан Wall-E 8 July 2017 в 18:19
поделиться

2 ответа

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

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

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

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

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

alt text

100
ответ дан Community 26 November 2019 в 20:58
поделиться

Я нашел этот пример действительно полезным, спасибо 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();
    }
  };
12
ответ дан 26 November 2019 в 20:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: