ภาพรวม
ตัวอย่างนี้สาธิตการใช้ CalendarView Widget สำหรับเลือกวันที่ แล้วนำวันที่ที่เลือกไปแสดงใน TextView
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่
Android Studio → File → New Project → Empty Activity
ขั้นตอนที่ 2: จัดรูปแบบหน้าจอ (activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/dateView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="150dp"
android:layout_marginTop="20dp"
android:text="Select Date"
android:textColor="@android:color/black"
android:textStyle="bold"
android:textSize="18sp" />
<CalendarView
android:id="@+id/calendarView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:dateTextAppearance="@style/CalendarDateStyle"
android:weekDayTextAppearance="@style/CalendarWeekDayStyle" />
</RelativeLayout>
ขั้นตอนที่ 3: เพิ่ม Style (res/values/styles.xml) - Optional
<style name="CalendarDateStyle" parent="android:TextAppearance.DeviceDefault.Small">
<item name="android:textColor">@android:color/black</item>
<item name="android:textSize">14sp</item>
</style>
<style name="CalendarWeekDayStyle" parent="android:TextAppearance.DeviceDefault.Small">
<item name="android:textColor">@android:color/darker_gray</item>
<item name="android:textStyle">bold</item>
</style>
ขั้นตอนที่ 4: เขียนโค้ด MainActivity.java
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.CalendarView;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private CalendarView calendarView;
private TextView dateView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
calendarView = findViewById(R.id.calendarView);
dateView = findViewById(R.id.dateView);
// ตั้งค่าวันที่เริ่มต้น (วันนี้)
updateDateView(Calendar.getInstance());
// Listener เมื่อเลือกวันที่
calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
@Override
public void onSelectedDayChange(@NonNull CalendarView view, int year, int month, int dayOfMonth) {
// month เริ่มจาก 0 (January = 0)
Calendar selectedDate = Calendar.getInstance();
selectedDate.set(year, month, dayOfMonth);
updateDateView(selectedDate);
}
});
}
private void updateDateView(Calendar calendar) {
// จัดรูปแบบวันที่แบบไทย
SimpleDateFormat thaiFormat = new SimpleDateFormat("dd MMMM yyyy", new Locale("th", "TH"));
// หรือรูปแบบมาตรฐาน
// SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy", Locale.getDefault());
String dateString = thaiFormat.format(calendar.getTime());
dateView.setText("Selected: " + dateString);
}
}
ขั้นตอนที่ 5: AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
</intent-filter>
</activity>
</application>
</manifest>
การทดสอบ
รันแอป → เลือกวันที่ใน CalendarView → ข้อความด้านบนจะอัปเดตตามวันที่เลือก
การปรับแต่ง CalendarView
| Attribute | คำอธิบาย |
|---|---|
| android:firstDayOfWeek | วันเริ่มต้นของสัปดาห์ (1=Sunday, 2=Monday) |
| android:minDate | วันที่ขั้นต่ำที่เลือกได้ (milliseconds) |
| android:maxDate | วันที่สูงสุดที่เลือกได้ (milliseconds) |
| android:shownWeekCount | จำนวนสัปดาห์ที่แสดง (คงที่) |
| android:dateTextAppearance | Style ของตัวเลขวันที่ |
| android:weekDayTextAppearance | Style ของหัวคอลัมน์วัน |
| android:focusedMonthDateColor | สีวันที่ของเดือนปัจจุบัน |
| android:unfocusedMonthDateColor | สีวันที่ของเดือนอื่น |
| android:selectedWeekBackgroundColor | สีพื้นหลังสัปดาห์ที่เลือก |
💡 แนะนำ: MaterialDatePicker (Material Components)
CalendarView เป็น Widget แบบเก่า แนะนำใช้ MaterialDatePicker ซึ่งทันสมัย สวยงาม และใช้ง่ายกว่า:
// build.gradle implementation 'com.google.android.material:material:1.6.0' // ใช้งาน MaterialDatePickerdatePicker = MaterialDatePicker.Builder.datePicker() .setTitleText("Select Date") .setSelection(MaterialDatePicker.todayInUtcMilliseconds()) .build(); datePicker.addOnPositiveButtonClickListener(selection -> { // selection เป็น milliseconds Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(selection); // อัปเดต UI }); datePicker.show(getSupportFragmentManager(), "DATE_PICKER");
สำหรับ Jetpack Compose
@Composable
fun DatePickerExample() {
var date by remember { mutableStateOf(Calendar.getInstance().time) }
Text(text = "Selected: ${SimpleDateFormat("dd MMM yyyy", Locale.getDefault()).format(date)}")
DatePickerDialog(onDateSet = { _, year, month, dayOfMonth ->
val cal = Calendar.getInstance().apply {
set(year, month, dayOfMonth)
}
date = cal.time
})
}