การใช้ DatePickerDialog และ DialogFragment เลือกวันที่ใน Android
ตัวอย่างนี้แสดงวิธีสร้าง DatePicker Dialog แบบ Modern ใช้ DialogFragment และ OnDateSetListener เพื่อรับวันที่ที่ผู้ใช้เลือก
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่
Android Studio → File → New Project → กรอกรายละเอียด → Finish
ขั้นตอนที่ 2: Layout - res/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:id="@+id/rl"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp"
tools:context=".MainActivity"
android:background="#f2f6f4">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="วันที่"
android:layout_above="@id/button"
android:textSize="30dp"
android:layout_centerHorizontal="true"
android:layout_marginBottom="28dp"
android:fontFamily="sans-serif-condensed" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ตั้งค่าวันที่"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
ขั้นตอนที่ 3: DatePickerFragment.java
package app.com.sample;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
import java.util.Calendar;
public class DatePickerFragment extends DialogFragment {
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
// ส่ง Listener เป็น Activity (ต้อง implements OnDateSetListener)
return new DatePickerDialog(
getActivity(),
(DatePickerDialog.OnDateSetListener) getActivity(),
year, month, day
);
}
}
ขั้นตอนที่ 4: MainActivity.java
package app.com.sample;
import android.app.DatePickerDialog;
import androidx.fragment.app.DialogFragment;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;
import java.text.DateFormat;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button);
button.setOnClickListener(v -> {
DialogFragment datePicker = new DatePickerFragment();
datePicker.show(getSupportFragmentManager(), "date_picker");
});
}
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
String currentDateString = DateFormat.getDateInstance(DateFormat.FULL).format(c.getTime());
TextView textView = findViewById(R.id.textView);
textView.setText(currentDateString);
}
}
ขั้นตอนที่ 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>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
DatePickerDialog แบบใหม่ (Material Design) - API 24+
// ใช้ MaterialDatePicker (Material Components 1.3+)
MaterialDatePicker<Long> picker = MaterialDatePicker.Builder.datePicker()
.setTitleText("เลือกวันที่")
.setSelection(MaterialDatePicker.todayInUtcMilliseconds())
.build();
picker.addOnPositiveButtonClickListener(selection -> {
String date = new SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())
.format(new Date(selection));
textView.setText(date);
});
picker.show(getSupportFragmentManager(), "material_date_picker");
การตั้งค่า DatePicker แบบโปรแกรม
DatePickerDialog dialog = new DatePickerDialog(this, listener, year, month, day); // จำกัดวันที่เลือกได้ dialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000); // ไม่ให้เลือกอดีต dialog.getDatePicker().setMaxDate(System.currentTimeMillis() + 365L * 24 * 60 * 60 * 1000); // สูงสุด 1 ปี // โหมด Spinner แทน Calendar (API 21+) dialog.getDatePicker().setCalendarViewShown(false); dialog.getDatePicker().setSpinnersShown(true);
DateFormat Style สำหรับไทย
// ใช้ Locale ไทย
DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, new Locale("th", "TH"));
// ผลลัพธ์: วันจันทร์ที่ 1 มกราคม พ.ศ. 2567
// หรือ SimpleDateFormat แบบกำหนดเอง
SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy", new Locale("th", "TH"));
⚠️ ข้อควรระวัง
- Month ใน Calendar เริ่มจาก 0 (January = 0)
- ใช้ DialogFragment เพื่อจัดการ Lifecycle ให้ถูกต้อง (ไม่ Leak เมื่อ rotate)
- MaterialDatePicker ใช้ได้กับ Material Components Library
- Android 14+ มีการเปลี่ยนแปลง DatePicker UI