Giới thiệu
Hướng dẫn sử dụng DatePickerDialog để chọn ngày, đặt ngày mặc định là hôm nay, và nhận ngày người dùng chọn qua interface OnDateSetListener.
Các bước thực hiện
Bước 1: Tạo dự án mới
Khởi tạo project Android Studio.
Bước 2: Giao diện chính (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="Ngày"
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="Chọn Ngày"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"/>
</RelativeLayout>
Bước 3: Tạo DatePickerFragment (res/layout/DatePickerFragment.java)
Right-click package → New → Java Class → Tên: DatePickerFragment
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.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);
// Truyền listener là Activity hiện tại (phải implement OnDateSetListener)
return new DatePickerDialog(getActivity(),
(DatePickerDialog.OnDateSetListener) getActivity(),
year, month, day);
}
}
Bước 4: MainActivity implement listener (src/MainActivity.java)
import android.app.DatePickerDialog;
import android.support.v4.app.DialogFragment;
import android.support.v7.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);
}
}
Bước 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>
Chạy ứng dụng
Kết nối thiết bị, nhấn Run. Nhấn "Chọn Ngày" → DatePickerDialog hiện với ngày hôm nay mặc định → chọn ngày → TextView cập nhật ngày đầy đủ (VD: "Thứ Hai, 15 Tháng Ba 2024").



Tùy chỉnh DatePickerDialog
1. Đặt ngày mặc định khác (không phải hôm nay)
Calendar c = Calendar.getInstance(); c.set(2024, Calendar.JANUARY, 1); // 1/1/2024 int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); return new DatePickerDialog(getActivity(), listener, year, month, day);
2. Giới hạn ngày min/max (API 24+)
DatePickerDialog dialog = new DatePickerDialog(...); dialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000); // Không cho chọn quá khứ dialog.getDatePicker().setMaxDate(System.currentTimeMillis() + 365L*24*60*60*1000); // Tối đa 1 năm tới
3. Theme cho Dialog
// Trong styles.xml
<style name="MyDatePickerDialog" parent="Theme.AppCompat.Light.Dialog">
<item name="colorAccent">@color/colorPrimary</item> <!-- Màu header/nút -->
</style>
// Khi tạo dialog
new DatePickerDialog(getActivity(), R.style.MyDatePickerDialog, listener, year, month, day);
4. Dùng MaterialDatePicker (Material Components - hiện đại)
// build.gradle: implementation 'com.google.android.material:material:1.6.0+'
MaterialDatePicker<Long> picker = MaterialDatePicker.Builder.datePicker()
.setTitleText("Chọn ngày")
.setSelection(MaterialDatePicker.todayInUtcMilliseconds())
.build();
picker.show(getSupportFragmentManager(), "MATERIAL_DATE_PICKER");
picker.addOnPositiveButtonClickListener(selection -> {
// selection là timestamp UTC
});
Lưu ý
- Month trong Calendar base-0: 0=Jan, 11=Dec
- Dùng
DialogFragmentđể dialog không bị leak khi rotate màn hình DateFormat.FULLbao gồm thứ, ngày, tháng, năm theo locale- MaterialDatePicker hỗ trợ range selection, theme tốt hơn, khuyên dùng cho app mới