點擊文本框、按鈕或任意 View 區域,彈出系統風格的日期選擇對話框,用戶選擇後回顯到控件上。適用於生日選擇、預約日期等場景。
Android 提供 `DatePickerDialog` 封裝了日曆選擇邏輯,配合 `OnDateSetListener` 即可快速實現。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/tv_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="點擊選擇日期"
android:textSize="18sp"
android:padding="12dp"
android:background="@android:drawable/edit_text"
android:drawableEnd="@android:drawable/ic_menu_my_calendar"
android:clickable="true"
android:focusable="true" />
</LinearLayout>
public class DatePickerActivity extends AppCompatActivity {
private TextView tvDate;
private int mYear, mMonth, mDay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_date_picker);
tvDate = findViewById(R.id.tv_date);
// 初始化為今天
Calendar calendar = Calendar.getInstance();
mYear = calendar.get(Calendar.YEAR);
mMonth = calendar.get(Calendar.MONTH);
mDay = calendar.get(Calendar.DAY_OF_MONTH);
updateDateText();
tvDate.setOnClickListener(v -> showDatePicker());
}
private void showDatePicker() {
DatePickerDialog dialog = new DatePickerDialog(
this,
(view, year, month, dayOfMonth) -> {
mYear = year;
mMonth = month;
mDay = dayOfMonth;
updateDateText();
},
mYear, mMonth, mDay
);
dialog.show();
}
private void updateDateText() {
String monthStr = (mMonth + 1) < 10 ? "0" + (mMonth + 1) : String.valueOf(mMonth + 1);
String dayStr = mDay < 10 ? "0" + mDay : String.valueOf(mDay);
tvDate.setText(mYear + "-" + monthStr + "-" + dayStr);
}
}
dialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000); // 今天之後
// 或
dialog.getDatePicker().setMaxDate(System.currentTimeMillis()); // 今天之前
<!-- styles.xml -->
<style name="CustomDatePicker" parent="Theme.AppCompat.Light.Dialog">
<item name="colorAccent">#FF5722</item> <!-- 選中顏色 -->
<item name="android:windowBackground">@android:color/white</item>
</style>
// 使用
new DatePickerDialog(this, R.style.CustomDatePicker, listener, year, month, day);
public class DatePickerFragment extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar c = Calendar.getInstance();
return new DatePickerDialog(requireActivity(),
(DatePickerDialog.OnDateSetListener) getTargetFragment(),
c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
}
}
// 調用
DatePickerFragment fragment = new DatePickerFragment();
fragment.setTargetFragment(this, REQUEST_CODE);
fragment.show(getSupportFragmentManager(), "datePicker");
`DatePickerDialog` + `OnDateSetListener` 是最輕量的原生方案。生產項目建議封裝為工具類或 `DialogFragment`,統一處理主題、範圍限制、生命周期,提升復用性與穩定性。