Làm cách nào để tạo công cụ chọn ngày và giờ trong Android? [đóng cửa]


128

Có tiện ích Android nào cho phép chọn ngày và giờ cùng lúc không? Tôi đã sử dụng bộ chọn thời gian cơ bản và bộ chọn ngày .

Nhưng chúng không phải là gợi cảm và thân thiện với người dùng (tôi tìm thấy). Bạn có biết nếu một widget bao gồm cả ngày và thời gian tồn tại?

Cảm ơn rất nhiều

Câu trả lời:


52

Không có gì được tích hợp vào Android cung cấp điều này.

EDIT: Andriod hiện cung cấp các bộ chọn tích hợp. Kiểm tra câu trả lời @Oded


2
Tôi biết phản hồi này đã hơn một năm tuổi, nhưng tôi nghĩ phản hồi này nên được cập nhật. Thư viện DateSlider được Rabi tham chiếu theo mọi cách dưới đây dường như là hoàn hảo cho việc này.
Stephan Branchot

Tôi đồng ý câu trả lời này nên được cập nhật vì đó là một tiện ích tuyệt vời. Tuy nhiên, mã được chỉ ra bởi Rabi đã hơi lỗi thời và chứa một số phương thức không dùng nữa, vd showDialog. Có lẽ một cái gì đó hiện tại sẽ đến cùng sớm.
Eugene van der Merwe

13
Thực tế câu trả lời là chính xác và không nên cập nhật. Ngay cả khi AndroidDateSlider tồn tại, không có gì được tích hợp vào Android cung cấp tính năng đó.
Cristian

4
Tôi có phải là người duy nhất gặp khó khăn khi Google thậm chí không hỗ trợ một trong những điều khiển được sử dụng rộng rãi nhất trong bất kỳ ứng dụng kinh doanh nào ngoài đó không?
l46kok

76

Đặt cả hai DatePickerTimePickertrong một bố cục XML.

date_time_picker.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:padding="8dp"
    android:layout_height="match_parent">

    <DatePicker
        android:id="@+id/date_picker"
        android:layout_width="match_parent"
        android:calendarViewShown="true"
        android:spinnersShown="false"
        android:layout_weight="4"
        android:layout_height="0dp" />

    <TimePicker
        android:id="@+id/time_picker"
        android:layout_weight="4"
        android:layout_width="match_parent"
        android:layout_height="0dp" />

    <Button
        android:id="@+id/date_time_set"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:text="Set"
        android:layout_height="0dp" />

</LinearLayout>

Mật mã:

final View dialogView = View.inflate(activity, R.layout.date_time_picker, null);
final AlertDialog alertDialog = new AlertDialog.Builder(activity).create();

dialogView.findViewById(R.id.date_time_set).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

         DatePicker datePicker = (DatePicker) dialogView.findViewById(R.id.date_picker);
         TimePicker timePicker = (TimePicker) dialogView.findViewById(R.id.time_picker);

         Calendar calendar = new GregorianCalendar(datePicker.getYear(),
                            datePicker.getMonth(),
                            datePicker.getDayOfMonth(),
                            timePicker.getCurrentHour(),
                            timePicker.getCurrentMinute());

         time = calendar.getTimeInMillis();
         alertDialog.dismiss();
    }});
alertDialog.setView(dialogView);
alertDialog.show();

2
Ví dụ tuyệt vời, cảm ơn. Một điểm ... có lẽ bạn muốn có alertDialog.dismiss (); khi kết thúc triển khai onClick.
Jonathan

Không thể chọn năm trong ví dụ này.
lostintranslation

Chỉ có một vấn đề ... khi sử dụng trong Android L, bộ chọn ngày và giờ không vừa với màn hình..tôi đã đặt linearLayout trong một cuộn Xem ... Bây giờ vấn đề là khi tôi cố gắng thay đổi thời gian cuộn bố cục bởi vì scrollView..Bất kỳ giải pháp nào cho việc này
Dominic D'Souza

Xin vui lòng giúp đỡ, nó không phù hợp trong chế độ nằm ngang, cách khắc phục
Awadesh

1
Android 6.0+ bố trí này có vẻ xấu xí; ( static.pychat.org/photo/f1qRFo31_Screenshot_20170214-123713.png
deathangel908

64

Sử dụng chức năng này, nó sẽ cho phép bạn lần lượt từng ngày và sau đó đặt nó thành ngày biến toàn cục. Không có thư viện không có XML.

Calendar date;
public void showDateTimePicker() {
   final Calendar currentDate = Calendar.getInstance();
   date = Calendar.getInstance();
   new DatePickerDialog(context, new DatePickerDialog.OnDateSetListener() {
       @Override
       public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            date.set(year, monthOfYear, dayOfMonth);
            new TimePickerDialog(context, new TimePickerDialog.OnTimeSetListener() {
                @Override
                public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                    date.set(Calendar.HOUR_OF_DAY, hourOfDay);
                    date.set(Calendar.MINUTE, minute);
                    Log.v(TAG, "The choosen one " + date.getTime());
                }
            }, currentDate.get(Calendar.HOUR_OF_DAY), currentDate.get(Calendar.MINUTE), false).show();
       }
   }, currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH), currentDate.get(Calendar.DATE)).show();
}

Một trong những cách đơn giản nhất
Vicky Thakor 16/12/18

3
Cuộc gọi yêu cầu API cấp 24.
RRaj

27

kết hợp DatePicker và TimePicker trong DialogFragment cho Android

Tôi đã tạo một thư viện để làm điều này. Nó cũng có màu sắc tùy biến!

Nó rất đơn giản để sử dụng.

Đầu tiên bạn tạo một trình nghe:

private SlideDateTimeListener listener = new SlideDateTimeListener() {

    @Override
    public void onDateTimeSet(Date date)
    {
        // Do something with the date. This Date object contains
        // the date and time that the user has selected.
    }

    @Override
    public void onDateTimeCancel()
    {
        // Overriding onDateTimeCancel() is optional.
    }
};

Sau đó, bạn tạo và hiển thị hộp thoại:

new SlideDateTimePicker.Builder(getSupportFragmentManager())
    .setListener(listener)
    .setInitialDate(new Date())
    .build()
    .show();

Tôi hy vọng bạn thấy nó hữu dụng.


thực sự tốt tiết kiệm thời gian của tôi cảm ơn ! Tuy nhiên, tôi đã phải sao chép mã, vì tôi nghĩ chuỗi phụ thuộc lớp không hợp lệ?
kuldeep

@ k2ibegin trang git của dự án nói rằng nhập toàn bộ mô-đun hoặc "sao chép mã", đó là điểm, ông đã không xuất bản công cụ chọn ngày tuyệt vời của mình trong bất kỳ kho lưu trữ nào. JDJ người đàn ông làm việc tốt, lib tuyệt vời.
Mã hóa Ninja

@JDJ xin lỗi, nhưng tôi chưa thể thêm thư viện của bạn vào dự án của mình, bạn có thể giải thích làm thế nào không?
Sebastian Delgado

3
Bước 1 tải xuống toàn bộ dự án bằng cách nhấp vào "Sao chép hoặc tải xuống" và sau đó "tải xuống ZIP" Bước 2 trích xuất nội dung zip hoặc chỉ thư mục ZIP \ SlideDateTimePicker-master \ slideDateTimePicker và sao chép thư mục đó vào thùng chứa thư mục gốc của dự án hiện tại của bạn bạn muốn thêm plugin. Bước 3 thêm Phụ thuộc thông qua Gradle với dự án biên dịch (': slideDateTimePicker') HOẶC với Android Studio: Tệp> Mới> Nhập dự án và chọn thư mục giải nén và định cấu hình nhập dự án thường chấp nhận và tiếp theo và kết thúc.
Mã hóa Ninja

2
@JDJ chúng tôi có một lỗi, trên Lollipop hoặc Marshmallow, DatePicker và TimePicker không được hiển thị, thay vào đó hiển thị các thành phần tiền kẹo.
Mã hóa Ninja

20

Gọi hộp thoại chọn thời gian trong DatePickerphương thức cập nhật. Nó sẽ không được gọi cùng lúc nhưng khi bạn nhấn DatePickernút set. Hộp thoại chọn thời gian sẽ mở ra. Phương pháp được đưa ra dưới đây.

package com.android.date;

import java.util.Calendar;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;
import android.widget.TimePicker;

public class datepicker extends Activity {

    private TextView mDateDisplay;
    private Button mPickDate;
    private int mYear;
    private int mMonth;
    private int mDay;
    private TextView mTimeDisplay;
    private Button mPickTime;

    private int mhour;
    private int mminute;

    static final int TIME_DIALOG_ID = 1;

    static final int DATE_DIALOG_ID = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mDateDisplay =(TextView)findViewById(R.id.date);
        mPickDate =(Button)findViewById(R.id.datepicker);
        mTimeDisplay = (TextView) findViewById(R.id.time);
        mPickTime = (Button) findViewById(R.id.timepicker);

        //Pick time's click event listener
        mPickTime.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                showDialog(TIME_DIALOG_ID);
            }
        });

        //PickDate's click event listener 
        mPickDate.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                showDialog(DATE_DIALOG_ID);
            }
        });

        final Calendar c = Calendar.getInstance();
        mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH);
        mDay = c.get(Calendar.DAY_OF_MONTH);
        mhour = c.get(Calendar.HOUR_OF_DAY);
        mminute = c.get(Calendar.MINUTE);
    }

    //-------------------------------------------update date---//    
    private void updateDate() {
        mDateDisplay.setText(
            new StringBuilder()
                    // Month is 0 based so add 1
                    .append(mDay).append("/")
                    .append(mMonth + 1).append("/")
                    .append(mYear).append(" "));
        showDialog(TIME_DIALOG_ID);
    }

      //-------------------------------------------update time---//    
    public void updatetime() {
        mTimeDisplay.setText(
                new StringBuilder()
                        .append(pad(mhour)).append(":")
                        .append(pad(mminute))); 
    }

    private static String pad(int c) {
        if (c >= 10)
            return String.valueOf(c);
        else
            return "0" + String.valueOf(c);


    //Datepicker dialog generation  

    private DatePickerDialog.OnDateSetListener mDateSetListener =
        new DatePickerDialog.OnDateSetListener() {

            public void onDateSet(DatePicker view, int year, 
                                  int monthOfYear, int dayOfMonth) {
                mYear = year;
                mMonth = monthOfYear;
                mDay = dayOfMonth;
                updateDate();
            }
        };


     // Timepicker dialog generation
        private TimePickerDialog.OnTimeSetListener mTimeSetListener =
            new TimePickerDialog.OnTimeSetListener() {
                public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                    mhour = hourOfDay;
                    mminute = minute;
                    updatetime();
                }
            };

        @Override
        protected Dialog onCreateDialog(int id) {
            switch (id) {
            case DATE_DIALOG_ID:
                return new DatePickerDialog(this,
                            mDateSetListener,
                            mYear, mMonth, mDay);

            case TIME_DIALOG_ID:
                return new TimePickerDialog(this,
                        mTimeSetListener, mhour, mminute, false);

            }
            return null;
        }
}

tệp chính được đưa ra dưới đây

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello"/>

    <TextView android:id="@+id/time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""/>

    <Button
        android:id="@+id/timepicker"
        android:text="Change Time" 
        android:layout_height="wrap_content" 
        android:layout_width="wrap_content"/>

    <TextView 
        android:id="@+id/date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""/>

    <Button android:id="@+id/datepicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="200dp"
        android:text="Change the date"/>

</LinearLayout>

14

Tôi cũng muốn kết hợp DatePicker và TimePicker. Vì vậy, tôi tạo một API để xử lý cả hai trong một giao diện! :)

https://github.com/Kunzisoft/Android-SwitchDateTimePicker

nhập mô tả hình ảnh ở đây

Bạn cũng có thể sử dụng SublimePicker


Giải pháp rất đẹp thanh lịch. Công trình tuyệt vời. Một vài chi tiết nhỏ tôi gặp phải .. 1) Nhãn AM / PM đã bị cắt ngắn, vì vậy tôi phải đặt một cỡ chữ nhỏ hơn theo kiểu: <item name="android:textSize">11sp</item> và xóa cài đặt đậm. 2) có vẻ như setDefaultDateTime(..)phải được gọi hoặc bạn có ngoại lệ thời gian chạy .. vì vậy tôi gọi đó chỉ Calendar.getInstance().getTime()với tham số. Dự án github tốt nhất cho một công cụ chọn ngày mà tôi đã thấy cho đến nay - cảm ơn vì đã chia sẻ nó
Gene Bo

13

Các URL bạn liên kết để hiển thị cách bật lên hộp thoại với bộ chọn thời gian và hộp thoại khác với bộ chọn ngày. Tuy nhiên, bạn cần lưu ý rằng bạn có thể sử dụng các widget UI đó trực tiếp trong bố cục của riêng bạn. Bạn có thể xây dựng hộp thoại của riêng mình bao gồm cả TimePicker và DatePicker trong cùng một chế độ xem, do đó hoàn thành những gì tôi nghĩ bạn đang tìm kiếm.

Nói cách khác, thay vì sử dụng TimePickerDialog và DatePickerDialog, chỉ cần sử dụng các widget UI TimePickerDatePicker trực tiếp trong hộp thoại hoặc hoạt động của riêng bạn.


1
Tôi đồng ý giải pháp của @Jaydeep Khamar không phải là những gì được yêu cầu, những người đang mở hai hộp thoại riêng biệt. Sẽ tốt hơn để xem mã mẫu cơ bản nơi mà điều này đã được kết hợp.
Eugene van der Merwe

9

Tôi đã phải đối mặt với cùng một vấn đề trong một trong các dự án của mình và đã quyết định tạo một widget tùy chỉnh có cả ngày và bộ chọn thời gian trong một hộp thoại thân thiện với người dùng. Bạn có thể lấy mã nguồn cùng với một ví dụ tại http://code.google.com.vn/p/datetimepicker/ . Mã được cấp phép theo Apache 2.0.



5

Bạn có thể sử dụng một trong DatePicker library wdullaer / MaterialDateTimePicker

  • Chương trình đầu tiên DatePicker.

    private void showDatePicker() {
    Calendar now = Calendar.getInstance();
    DatePickerDialog dpd = DatePickerDialog.newInstance(
            HomeActivity.this,
            now.get(Calendar.YEAR),
            now.get(Calendar.MONTH),
            now.get(Calendar.DAY_OF_MONTH)
    );
    dpd.show(getFragmentManager(), "Choose Date:");
    }
  • Sau đó onDateSet callback store date & show TimePicker

    @Override
    public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {
    Calendar cal = Calendar.getInstance();
    cal.set(year, monthOfYear, dayOfMonth);
    filter.setDate(cal.getTime());
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            showTimePicker();
        }
    },500);
    }
  • Vào onTimeSet callbackgiờ cửa hàng

     @Override
     public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute) {
    Calendar cal = Calendar.getInstance();
    if(filter.getDate()!=null)
        cal.setTime(filter.getDate());
    cal.set(Calendar.HOUR_OF_DAY,hourOfDay);
    cal.set(Calendar.MINUTE,minute);
    }


2

Một lựa chọn khác là bánh xe android dự án khá gần với hộp thoại UIDatePicker của iOS.

Nó cung cấp một thanh trượt dọc để chọn bất cứ thứ gì (bao gồm cả ngày và thời gian). Nếu bạn thích thanh trượt ngang, DateSlider được Rabi tham chiếu là tốt hơn.


Liên kết bị hỏng. Đây là một ngã ba của bánh xe android .
jk7


1

Tôi đã tạo một hộp thoại cảnh báo kết hợp Bộ chọn ngày và Bộ chọn thời gian. Bạn có thể nhận mã tại https://github.com/nguyentoantuit/android Lưu ý: DateTimePicker là một thư viện


1
Lưu ý rằng các câu trả lời chỉ liên kết không được khuyến khích, các câu trả lời SO phải là điểm cuối của tìm kiếm giải pháp (so với một điểm dừng khác của tài liệu tham khảo, có xu hướng bị cũ theo thời gian). Vui lòng xem xét việc thêm một bản tóm tắt độc lập ở đây, giữ liên kết làm tài liệu tham khảo.
kleopatra

1

Đây là một phiên bản nhỏ gọn hơn về ý tưởng hiển thị một hộp thoại của Jaydeep. Tôi thích giải pháp này vì nó không có phụ thuộc.

        Date value = new Date();
        final Calendar cal = Calendar.getInstance();
        cal.setTime(value);
        new DatePickerDialog(this,
            new DatePickerDialog.OnDateSetListener() {
                @Override public void onDateSet(DatePicker view, 
                        int y, int m, int d) {
                    cal.set(Calendar.YEAR, y);
                    cal.set(Calendar.MONTH, m);
                    cal.set(Calendar.DAY_OF_MONTH, d);

                    // now show the time picker
                    new TimePickerDialog(NoteEditor.this,
                        new TimePickerDialog.OnTimeSetListener() {
                            @Override public void onTimeSet(TimePicker view, 
                                    int h, int min) {
                                cal.set(Calendar.HOUR_OF_DAY, h);
                                cal.set(Calendar.MINUTE, min);
                                value = cal.getTime();
                            }
                        }, cal.get(Calendar.HOUR_OF_DAY), 
                            cal.get(Calendar.MINUTE), true).show();
                 }
            }, cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
            cal.get(Calendar.DAY_OF_MONTH)).show();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.