บทนำ
ตัวอย่างนี้แสดงวิธีใช้ CalendarView วิดเจ็ตปฏิทินในตัวของ Android เพื่อเลือกวันที่และแสดงผล
ขั้นตอนที่ 1: สร้างโปรเจกต์
สร้างโปรเจกต์ Android ใหม่ใน Android Studio
ขั้นตอนที่ 2: Layout (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"
android:padding="4dp"
tools:context=".MainActivity">
<TextView
android:id="@+id/dateView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
android:text="Selected Date"
android:textColor="@android:color/background_dark"
android:textStyle="bold"
android:textSize="18sp" />
<CalendarView
android:id="@+id/calendarView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/dateView"
android:layout_centerInParent="true"
android:layout_marginTop="20dp"
android:firstDayOfWeek="2"
android:minDate="2020-01-01"
android:maxDate="2030-12-31"
android:showWeekNumber="false"
android:focusedMonthDateColor="@android:color/holo_blue_dark"
android:weekSeparatorLineColor="@android:color/darker_gray"
android:selectedWeekBackgroundColor="@android:color/holo_green_light"
android:unfocusedMonthDateColor="@android:color/darker_gray" />
</RelativeLayout>
ขั้นตอนที่ 3: MainActivity.kt
import android.os.Bundle
import android.widget.CalendarView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
private lateinit var calendarView: CalendarView
private lateinit var dateView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "CalendarView Demo"
calendarView = findViewById(R.id.calendarView)
dateView = findViewById(R.id.dateView)
// ตั้งค่าวันที่เริ่มต้น
val today = java.util.Calendar.getInstance()
dateView.text = "Selected: ${today.get(java.util.Calendar.DAY_OF_MONTH)}/${today.get(java.util.Calendar.MONTH) + 1}/${today.get(java.util.Calendar.YEAR)}"
calendarView.setOnDateChangeListener { _, year, month, dayOfMonth ->
// month เริ่มจาก 0 (January = 0)
val date = "$dayOfMonth/${month + 1}/$year"
dateView.text = "Selected: $date"
}
}
}
ขั้นตอนที่ 4: Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="com.example.calendarview">
<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>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
CalendarView Attributes สำคัญ
| Attribute | คำอธิบาย |
|---|---|
android:firstDayOfWeek | วันแรกของสัปดาห์ (1=อาทิตย์, 2=จันทร์, ...) |
android:minDate | วันที่ขั้นต่ำที่เลือกได้ (format: mm/dd/yyyy) |
android:maxDate | วันที่สูงสุดที่เลือกได้ |
android:showWeekNumber | แสดงหมายเลขสัปดาห์ (true/false) |
android:dateTextAppearance | สไตล์ข้อความวันที่ |
android:focusedMonthDateColor | สีวันที่ของเดือนที่โฟกัส |
android:unfocusedMonthDateColor | สีวันที่ของเดือนอื่น |
android:selectedWeekBackgroundColor | สีพื้นหลังสัปดาห์ที่เลือก |
การตั้งค่าวันที่โดยโปรแกรม
// ตั้งค่าวันที่เฉพาะ
calendarView.date = java.util.Calendar.getInstance().apply {
set(2024, 11, 25) // ปี, เดือน(0-based), วัน
timeInMillis
}.timeInMillis
// ได้วันที่ปัจจุบัน
val selectedDate = calendarView.date // คืนค่า milliseconds since epoch
แนวทางทันสมัย: MaterialDatePicker
สำหรับ UI ที่ทันสมัยกว่า ควรใช้ MaterialDatePicker จาก Material Components Library:
dependencies {
implementation 'com.google.android.material:material:1.11.0'
}
// ใช้งาน
val picker = MaterialDatePicker.Builder.datePicker()
.setTitleText("Select Date")
.setSelection(MaterialDatePicker.todayInUtcMilliseconds())
.build()
picker.show(supportFragmentManager, "DATE_PICKER")
picker.addOnPositiveButtonClickListener { selection ->
val date = java.text.SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())
.format(java.util.Date(selection))
}