Освой Android играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Компонент Chronometer находился в разделе Date в старых версиях студии. Позволяет пользователю запускать и останавливать начальный отсчёт времени, а также задавать время запуска таймера.
Класс Chronometer имеет интерфейс OnChronometerTickListener.
Поместите на экран активности компонент Chronometer и три кнопки Старт, Стоп, Сброс.
Напишем код для запуска, остановки и сброса секундомера. Весь код сводится обработке щелчков кнопки.
// Kotlin
// Если этот код работает, его написал Александр Климов,
// а если нет, то не знаю, кто его писал.
package ru.alexanderklimov.chronometer
import android.os.Bundle
import android.os.SystemClock
import android.widget.Chronometer
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
private lateinit var chronometer: Chronometer
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
chronometer = findViewById(R.id.chronometer)
chronometer.setOnChronometerTickListener {
val elapsedMillis: Long = (SystemClock.elapsedRealtime() - chronometer.base)
if (elapsedMillis > 5000 && elapsedMillis < 6000) {
val strElapsedMillis = "Прошло больше 5 секунд"
Toast.makeText(
this,
strElapsedMillis, Toast.LENGTH_SHORT
).show()
}
}
startButton.setOnClickListener {
chronometer.base = SystemClock.elapsedRealtime()
chronometer.start()
}
stopButton.setOnClickListener {
chronometer.stop()
}
resetButton.setOnClickListener {
chronometer.base = SystemClock.elapsedRealtime()
}
}
}
// Java
package ru.alexanderklimov.chronometer;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Chronometer;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Chronometer mChronometer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mChronometer = findViewById(R.id.chronometer);
mChronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
long elapsedMillis = SystemClock.elapsedRealtime()
- mChronometer.getBase();
if (elapsedMillis > 5000) {
String strElapsedMillis = "Прошло больше 5 секунд";
Toast.makeText(getApplicationContext(),
strElapsedMillis, Toast.LENGTH_SHORT)
.show();
}
}
});
}
public void onStartClick(View view) {
mChronometer.setBase(SystemClock.elapsedRealtime());
mChronometer.start();
}
public void onStopClick(View view) {
mChronometer.stop();
}
public void onResetClick(View view) {
mChronometer.setBase(SystemClock.elapsedRealtime());
}
}
В примере также добавлена реализация OnChronometerTickListener - когда секундомер отсчитает 5 секунд, то появится всплывающее сообщение.
В API 24 появился новый метод setCountDown(), позволяющий работать в режиме обратного отсчёта. Родственный XML-атрибут для него - android:countDown. Метод isCountDown() позволит узнать, в каком режиме работает хронометр.
private Chronometer mChronometer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mChronometer = findViewById(R.id.chronometer);
mChronometer.setCountDown(true);
// установим начальное значение
mChronometer.setBase(SystemClock.elapsedRealtime() + 1000 * 5);
}
public void onClick(View view) {
mChronometer.setBase(SystemClock.elapsedRealtime() + 1000 * 5);
Log.i("Chronometer", "Обратный отсчёт: " + mChronometer.isCountDown());
mChronometer.start();
}
Читая документацию, наткнулся на новый метод из API 26 (Android 8.0 Oreo) - isTheFinalCountDown(). Я запустил этот код и чуть не упал со стула от неожиданности - неожиданно в телефоне заиграл видеоролик с песней "The Final Countdown/Последний отсчёт" группы "Европа/Europe". Разработчики развлекаются.