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

Cách viết Listener cho DatePicker và TimePicker trong Android

Giới thiệu

Bài viết này minh họa cách lắng nghe sự kiện thay đổi ngày trên DatePicker (OnDateChangedListener) và thời gian trên TimePicker (OnTimeChangedListener). Sử dụng 2 Activity: MainActivity cho DatePicker, TimePickerActivity cho TimePicker.

Các bước thực hiện

Bước 1: Tạo dự án mới

Mở Android Studio, chọn File → New Project và tạo dự án.

Bước 2: Layout chính (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <DatePicker
        android:id="@+id/datePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true" />

    <Button
        android:id="@+id/btnTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/datePicker"
        android:layout_centerInParent="true"
        android:layout_marginTop="36dp"
        android:text="Mở Time Picker"
        android:textStyle="bold" />

</RelativeLayout>

Bước 3: Code MainActivity (src/MainActivity.java)

import android.annotation.TargetApi;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    Button btnTime;

    @TargetApi(Build.VERSION_CODES.O)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnTime = findViewById(R.id.btnTime);
        DatePicker datePicker = findViewById(R.id.datePicker);

        // Listener cho DatePicker
        datePicker.setOnDateChangedListener((view, year, monthOfYear, dayOfMonth) -> {
            String msg = "Ngày đã chọn: " + dayOfMonth + " - " + (monthOfYear + 1) + " - " + year;
            Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
        });

        // Mở TimePickerActivity
        btnTime.setOnClickListener(v -> {
            Intent intent = new Intent(MainActivity.this, TimePickerActivity.class);
            startActivity(intent);
        });
    }
}

Bước 4: Layout TimePicker (res/layout/activity_time_picker.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=".TimePickerActivity">

    <TimePicker
        android:id="@+id/timePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

</RelativeLayout>

Bước 5: Code TimePickerActivity (src/TimePickerActivity.java)

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TimePicker;
import android.widget.Toast;

public class TimePickerActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_time_picker);

        TimePicker timePicker = findViewById(R.id.timePicker);
        timePicker.setOnTimeChangedListener((view, hourOfDay, minute) -> {
            String msg = "Giờ đã chọn: " + hourOfDay + "h" + String.format("%02d", minute);
            Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        });
    }
}

Bước 6: Cấu hình 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>
        <activity android:name=".TimePickerActivity" />
    </application>
</manifest>

Chạy ứng dụng

Kết nối thiết bị, nhấn Run. Thay đổi ngày trên DatePicker -> Toast hiển thị ngày. Nhấn "Mở Time Picker" -> màn hình TimePicker, thay đổi giờ/phút -> Toast hiển thị thời gian.

DatePickerDialog & TimePickerDialog (Khuyên dùng)

Thay vì nhúng widget vào layout, thường dùng Dialog cho gọn:

// DatePickerDialog
DatePickerDialog dateDialog = new DatePickerDialog(this, (view, year, month, day) -> {
    // month là 0-based
}, 2024, 5, 15);
dateDialog.show();

// TimePickerDialog
TimePickerDialog timeDialog = new TimePickerDialog(this, (view, hour, minute) -> {
    // hour: 0-23, minute: 0-59
}, 14, 30, true); // true = 24h format
timeDialog.show();

Lưu ý quan trọng

  • Month là 0-based: 0 = Tháng 1, 11 = Tháng 12. Luôn +1 khi hiển thị cho user
  • TimePicker 24h format: hourOfDay từ 0-23. Dùng is24HourView() để kiểm tra chế độ
  • API 23+: DatePicker/TimePicker có chế độ Spinner hoặc Calendar/Clock – listener hoạt động giống nhau
  • MaterialDatePicker/MaterialTimePicker: Thư viện Material Components mới, UI đẹp hơn, API hiện đại