Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีใช้ Calendar Widget ด้วย CalendarView ใน Android

ภาพรวม

ตัวอย่างนี้สาธิตการใช้ 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 → ข้อความด้านบนจะอัปเดตตามวันที่เลือก

วิธีใช้ Calendar Widget ด้วย CalendarView ใน Android

การปรับแต่ง CalendarView

Attributeคำอธิบาย
android:firstDayOfWeekวันเริ่มต้นของสัปดาห์ (1=Sunday, 2=Monday)
android:minDateวันที่ขั้นต่ำที่เลือกได้ (milliseconds)
android:maxDateวันที่สูงสุดที่เลือกได้ (milliseconds)
android:shownWeekCountจำนวนสัปดาห์ที่แสดง (คงที่)
android:dateTextAppearanceStyle ของตัวเลขวันที่
android:weekDayTextAppearanceStyle ของหัวคอลัมน์วัน
android:focusedMonthDateColorสีวันที่ของเดือนปัจจุบัน
android:unfocusedMonthDateColorสีวันที่ของเดือนอื่น
android:selectedWeekBackgroundColorสีพื้นหลังสัปดาห์ที่เลือก

💡 แนะนำ: MaterialDatePicker (Material Components)

CalendarView เป็น Widget แบบเก่า แนะนำใช้ MaterialDatePicker ซึ่งทันสมัย สวยงาม และใช้ง่ายกว่า:

// build.gradle
implementation 'com.google.android.material:material:1.6.0'

// ใช้งาน
MaterialDatePicker datePicker = 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
    })
}