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

วิธีตั้งค่าวันที่ใน DatePicker Dialog ใน Android

การใช้ 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