設計 Android 程序實現:數字時鐘+模擬時鐘顯示系統時間,通過 DatePicker/TimePicker 設置時間並同步顯示。核心在於 Calendar 實例的傳遞與同步機制。
避免兩個 Activity 切換帶來的數據傳遞複雜度,主界面彈出設置對話框。
public class ClockActivity extends AppCompatActivity {
private AnalogClock analogClock;
private TextView digitalClock;
private Calendar currentTime = Calendar.getInstance(); // 核心時間模型
private Handler timeHandler = new Handler(Looper.getMainLooper());
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_clock);
analogClock = findViewById(R.id.analog_clock);
digitalClock = findViewById(R.id.digital_clock);
// 1. 初始同步系統時間
syncSystemTime();
// 2. 啟動秒級更新
startClockTick();
// 3. 設置按鈕點擊
findViewById(R.id.btn_set_time).setOnClickListener(v -> showTimePickerDialog());
}
private void syncSystemTime() {
currentTime = Calendar.getInstance(); // 獲取當前系統時間
updateDisplay();
}
private void startClockTick() {
timeHandler.postDelayed(new Runnable() {
@Override public void run() {
currentTime.add(Calendar.SECOND, 1); // 模型自增
updateDisplay();
timeHandler.postDelayed(this, 1000);
}
}, 1000);
}
private void updateDisplay() {
// 數字時鐘
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
digitalClock.setText(sdf.format(currentTime.getTime()));
// 模擬時鐘(AnalogClock 已棄用,建議自定義 View 或用 TextClock)
// analogClock 會自動跟隨系統時間,若需跟隨 currentTime 需自定義
}
private void showTimePickerDialog() {
TimePickerDialog dialog = new TimePickerDialog(this,
(view, hourOfDay, minute) -> {
currentTime.set(Calendar.HOUR_OF_DAY, hourOfDay);
currentTime.set(Calendar.MINUTE, minute);
currentTime.set(Calendar.SECOND, 0);
updateDisplay();
},
currentTime.get(Calendar.HOUR_OF_DAY),
currentTime.get(Calendar.MINUTE),
true // 24小時制
);
dialog.show();
}
@Override
protected void onDestroy() {
super.onDestroy();
timeHandler.removeCallbacksAndMessages(null);
}
}
通過 Intent 傳遞 Calendar 序列化數據:
// ClockActivity → 設置時間
Intent intent = new Intent(this, SetTimeActivity.class);
intent.putExtra("time_millis", currentTime.getTimeInMillis());
startActivityForResult(intent, REQUEST_SET_TIME);
// SetTimeActivity 返回結果
Intent result = new Intent();
result.putExtra("time_millis", pickerCalendar.getTimeInMillis());
setResult(RESULT_OK, result);
finish();
// ClockActivity 接收
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_SET_TIME && resultCode == RESULT_OK) {
long millis = data.getLongExtra("time_millis", -1);
if (millis != -1) {
currentTime.setTimeInMillis(millis);
updateDisplay();
}
}
}
| 方法 | 用途 |
|---|---|
getInstance() | 獲取當前時區/ Locale 的 Calendar 實例(系統時間) |
getTimeInMillis() | 獲取毫秒時間戳(long),可序列化傳遞 |
setTimeInMillis(long) | 從時間戳恢復 Calendar 狀態 |
add(field, amount) | 日期運算(如加 1 秒、減 1 天) |
set(field, value) | 設置具體字段(HOUR_OF_DAY, MINUTE 等) |
getTime() | 返回 Date 對象,供 SimpleDateFormat 格式化 |