Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách đặt ngày mặc định cho DatePickerDialog trong Android?

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").

Cách đặt ngày mặc định cho DatePickerDialog trong Android?

Cách đặt ngày mặc định cho DatePickerDialog trong Android?

Cách đặt ngày mặc định cho DatePickerDialog trong Android?

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.FULL bao 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