จะสร้างตัวเลือกวันที่และเวลาใน Android ได้อย่างไร [ปิด]


128

มีวิดเจ็ต Android ที่สามารถเลือกวันที่และเวลาพร้อมกันได้หรือไม่? ฉันใช้ตัวเลือกเวลาพื้นฐานและตัวเลือกวันที่แล้ว

แต่พวกเขาไม่ได้เซ็กซี่และเป็นมิตรกับผู้ใช้ (ฉันพบ) คุณรู้หรือไม่ว่ามีวิดเจ็ตรวมทั้งวันที่และเวลาอยู่หรือไม่?

ขอบคุณมาก Luc

คำตอบ:


52

ไม่มีสิ่งใดใน Android ที่นำเสนอสิ่งนี้

แก้ไข: Andriod มีตัวเลือกในตัวแล้ว ตรวจสอบคำตอบ @Oded


2
ฉันรู้ว่าคำตอบนี้มีอายุมากกว่าหนึ่งปี แต่ฉันคิดว่าคำตอบนี้ควรได้รับการอัปเดต ไลบรารี DateSlider ที่ Rabi อ้างอิงถึงด้านล่างนี้ดูเหมือนจะสมบูรณ์แบบสำหรับสิ่งนี้
Stephan Branczyk

ฉันยอมรับว่าคำตอบนี้ควรได้รับการอัปเดตเพราะเป็นวิดเจ็ตที่ยอดเยี่ยม อย่างไรก็ตามรหัสที่ชี้ไปตาม Rabi showDialogอยู่แล้วบิตล้าสมัยและมีวิธีการบางอย่างเช่นเลิก บางทีอาจมีบางอย่างที่เป็นปัจจุบันมากขึ้นในไม่ช้า
Eugene van der Merwe

13
คำตอบที่จริงถูกต้องและไม่ควรอัปเดต แม้ว่า AndroidDateSlider จะมีอยู่ แต่ก็ไม่มีสิ่งใดใน Android ที่มีคุณสมบัติดังกล่าว
Cristian

4
ฉันเป็นคนเดียวที่งุนงงกับข้อเท็จจริงที่ว่า Google ไม่รองรับแม้แต่การควบคุมที่ใช้กันอย่างแพร่หลายในแอปพลิเคชันทางธุรกิจใด ๆ
l46kok

76

ใส่ทั้งสองอย่างDatePickerและTimePickerใน 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>

รหัส:

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
ตัวอย่างที่ยอดเยี่ยมขอบคุณ จุดหนึ่ง ... คุณอาจต้องการให้ alertDialog.dismiss (); ในตอนท้ายของการใช้งาน onClick
โจนาธาน

ไม่สามารถเลือกปีในตัวอย่างนี้
lostintranslation

มีปัญหาเพียงข้อเดียว ... เมื่อใช้ใน android L ตัวเลือกวันที่และเวลาไม่พอดีกับหน้าจอฉันจึงใส่ linearLayout ใน scrollView ... ตอนนี้ปัญหาคือเมื่อฉันพยายามเปลี่ยนเวลาที่เค้าโครงเลื่อน เพราะ scrollView .. วิธีแก้ปัญหานี้
Dominic D'Souza

โปรดช่วยด้วยมันไม่พอดีกับโหมดแนวนอนวิธีแก้ไข
Awadesh

1
Android 6.0+ เค้าโครงนี้ดูน่าเกลียด ( static.pychat.org/photo/f1qRFo31_Sc
Screenshot_20170214-123713.png

64

ใช้ฟังก์ชั่นนี้จะช่วยให้คุณสามารถสร้างวันที่และเวลาทีละภาพจากนั้นตั้งค่าเป็นวันที่ตัวแปรส่วนกลาง ไม่มีไลบรารีไม่มี 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();
}

วิธีที่ง่ายที่สุดวิธีหนึ่ง
Vicky Thakor

3
การโทรต้องใช้ API ระดับ 24
RRaj

27

DatePicker และ TimePicker รวมกันใน DialogFragment สำหรับ Android

ฉันสร้างห้องสมุดเพื่อทำสิ่งนี้ นอกจากนี้ยังมีสีที่ปรับแต่งได้!

ใช้งานง่ายมาก

ก่อนอื่นคุณต้องสร้างผู้ฟัง:

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.
    }
};

จากนั้นคุณสร้างและแสดงกล่องโต้ตอบ:

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

ฉันหวังว่าคุณพบว่ามีประโยชน์.


ดีจริงๆ! ประหยัดเวลาของฉัน! ขอบคุณ! อย่างไรก็ตามฉันต้องโคลนรหัสเพราะฉันคิดว่าสตริงการพึ่งพาการไล่ระดับสีไม่ถูกต้อง?
kuldeep

@ k2ibegin หน้า git ของโปรเจ็กต์บอกว่าให้นำเข้าทั้งโมดูลหรือ "โคลนโค้ด" นั่นคือประเด็นที่เขาไม่ได้เผยแพร่ตัวเลือกวันเวลาที่ยอดเยี่ยมของเขาในที่เก็บใด ๆ JDJ คนทำงานที่ดี lib ที่ยอดเยี่ยม
Ninja Coding

@JDJ ขอโทษ แต่ฉันไม่สามารถเพิ่มห้องสมุดของคุณในโครงการของฉันได้คุณช่วยอธิบายได้อย่างไร
Sebastian Delgado

3
ขั้นตอนที่ 1ดาวน์โหลดโครงการทั้งหมดโดยคลิก "โคลนหรือดาวน์โหลด" จากนั้น "ดาวน์โหลด ZIP" ขั้นตอนที่ 2แยกเนื้อหา zip หรือเพียงแค่โฟลเดอร์ ZIP \ SlideDateTimePicker-master \ slideDateTimePickerและคัดลอกโฟลเดอร์นั้นไปยังคอนเทนเนอร์โฟลเดอร์รากของโครงการที่มีอยู่ คุณต้องการเพิ่มปลั๊กอิน ขั้นตอนที่ 3เพิ่ม Dependency ผ่าน Gradle ด้วยโปรเจ็กต์คอมไพล์ (': slideDateTimePicker')หรือด้วย Android Studio: ไฟล์> ใหม่> นำเข้าโปรเจ็กต์และเลือกโฟลเดอร์ที่แยกแล้วและกำหนดค่าการนำเข้าโปรเจ็กต์ตามปกติยอมรับและถัดไปและเสร็จสิ้น
Ninja Coding

2
@JDJ เรามีข้อผิดพลาดบน Lollipop หรือ Marshmallow ไม่แสดง DatePicker และ TimePicker ดั้งเดิมแสดงส่วนประกอบก่อนอมยิ้มแทน
Ninja Coding

20

เรียกกล่องโต้ตอบตัวเลือกเวลาในวิธีการDatePickerอัปเดตเวลา จะไม่ถูกเรียกพร้อมกัน แต่เมื่อคุณกดปุ่มDatePickerset กล่องโต้ตอบตัวเลือกเวลาจะเปิดขึ้น วิธีการได้รับด้านล่าง

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;
        }
}

main.xml ได้รับด้านล่าง

<?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

ฉันยังต้องการรวม DatePicker และ TimePicker ดังนั้นฉันจึงสร้าง API เพื่อจัดการทั้งสองอย่างในอินเทอร์เฟซเดียว! :)

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

ใส่คำอธิบายภาพที่นี่

คุณยังสามารถใช้SublimePicker


ทางออกที่สวยงามมาก ใช้งานได้ดี รายละเอียดเล็ก ๆ น้อย ๆ ที่ฉันพบ .. 1) ป้ายกำกับ AM / PM ถูกตัดให้สั้นลงดังนั้นฉันจึงต้องกำหนดขนาดตัวอักษรให้เล็กลงในรูปแบบ: <item name="android:textSize">11sp</item> และลบการตั้งค่าตัวหนาออก 2) ดูเหมือนว่าsetDefaultDateTime(..)จะต้องถูกเรียกหรือคุณได้รับข้อยกเว้นรันไทม์ .. ดังนั้นฉันจึงเรียกสิ่งนั้นด้วยCalendar.getInstance().getTime()พารามิเตอร์ โครงการ github ที่ดีที่สุดสำหรับเครื่องมือเลือกวันที่ที่ฉันเคยเห็น - ขอบคุณที่แบ่งปัน
Gene Bo

13

URL ที่คุณเชื่อมโยงเพื่อแสดงวิธีแสดงกล่องโต้ตอบที่มีตัวเลือกเวลาและอีกกล่องโต้ตอบที่มีตัวเลือกวันที่ อย่างไรก็ตามคุณต้องทราบว่าคุณสามารถใช้วิดเจ็ต UI เหล่านั้นได้โดยตรงในรูปแบบของคุณเอง คุณสามารถสร้างกล่องโต้ตอบของคุณเองซึ่งมีทั้ง TimePicker และ DatePicker ในมุมมองเดียวกันดังนั้นจึงบรรลุสิ่งที่ฉันคิดว่าคุณกำลังมองหา

กล่าวอีกนัยหนึ่งแทนที่จะใช้ TimePickerDialog และ DatePickerDialog เพียงแค่ใช้วิดเจ็ต UI TimePickerและDatePickerโดยตรงในกล่องโต้ตอบหรือกิจกรรมของคุณเอง


1
ฉันเห็นด้วยกับการแก้ปัญหาของ @Jaydeep Khamar ไม่ใช่สิ่งที่ถูกถามซึ่งกำลังเปิดกล่องโต้ตอบสองรายการแยกกัน จะเป็นการดีกว่าหากเห็นโค้ดตัวอย่างพื้นฐานที่รวมกันแล้ว
Eugene van der Merwe

9

ฉันประสบปัญหาเดียวกันในหนึ่งในโครงการของฉันและตัดสินใจสร้างวิดเจ็ตแบบกำหนดเองที่มีทั้งตัวเลือกวันที่และเวลาในกล่องโต้ตอบที่ใช้งานง่าย คุณจะได้รับรหัสที่มาพร้อมกับตัวอย่างที่http://code.google.com/p/datetimepicker/ รหัสได้รับอนุญาตภายใต้ Apache 2.0



5

คุณสามารถใช้หนึ่งในDatePicker library wdullaer / MaterialDateTimePicker

  • แสดง 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:");
    }
  • แล้วก็ 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);
    }
  • ตรงonTimeSet callbackเวลาร้าน

     @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

อีกทางเลือกหนึ่งคือandroid-wheelโครงการที่ปิดกล่องโต้ตอบ UIDatePicker ของ iOS

มีแถบเลื่อนแนวตั้งเพื่อเลือกอะไรก็ได้ (รวมถึงวันที่และเวลา) หากคุณชอบแถบเลื่อนแนวนอน DateSlider ที่ Rabi อ้างอิงจะดีกว่า


ลิงก์เสีย นี่คือการแยกของหุ่นยนต์ล้อ
jk7


1

ฉันได้สร้างกล่องโต้ตอบการแจ้งเตือนซึ่งรวมตัวเลือกวันที่และตัวเลือกเวลา คุณสามารถรับรหัสได้ที่https://github.com/nguyentoantuit/android หมายเหตุ: DateTimePicker เป็นห้องสมุด


1
โปรดทราบว่าคำตอบแบบลิงก์เท่านั้นไม่ได้รับการสนับสนุนคำตอบ SO ควรเป็นจุดสิ้นสุดของการค้นหาวิธีแก้ปัญหา (เทียบกับการหยุดการอ้างอิงอื่น ๆ ซึ่งมักจะค้างเมื่อเวลาผ่านไป) โปรดพิจารณาเพิ่มเรื่องย่อแบบสแตนด์อโลนที่นี่โดยเก็บลิงก์ไว้เป็นข้อมูลอ้างอิง
kleopatra

1

นี่คือแนวคิดของ Jaydeep ในเวอร์ชันที่กะทัดรัดกว่าในการแสดงกล่องโต้ตอบหนึ่งรายการต่อจากกัน ฉันชอบโซลูชันนี้เพราะไม่มีการอ้างอิง

        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();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.