Android에서 날짜 및 시간 선택기를 만드는 방법은 무엇입니까? [닫은]


128

날짜와 시간을 동시에 선택할 수있는 안드로이드 위젯이 있습니까? 나는 이미 기본 시간 선택기 와 날짜 선택기를 사용하고 있습니다.

그러나 그들은 섹시하고 사용자 친화적이지 않습니다 (내가 찾았습니다). 날짜와 시간을 포함한 위젯이 존재하는지 알고 있습니까?

고마워, 루크

답변:


52

이것을 제공하는 안드로이드에는 아무것도 없습니다.

편집 : Andriod는 이제 내장 피커를 제공합니다. @Oded 답변 확인


2
이 답변이 1 년이 지난 것을 알고 있지만이 답변을 업데이트해야한다고 생각합니다. 아래의 모든 방법으로 Rabi가 참조한 DateSlider 라이브러리가 이에 적합합니다.
— Stephan Branczyk

이 답변은 멋진 위젯이므로 업데이트해야한다는 데 동의합니다. 그러나 Rabi가 지적한 코드는 이미 약간 구식이며 더 이상 사용되지 않는 메소드를 포함 showDialog합니다. 아마도 더 최신의 것이 곧 올 것입니다.
— 유진 반 데르 메웨

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 구현이 끝날 때
— Jonathan

이 예에서는 연도를 선택할 수 없습니다.
— lostintranslation

단 하나의 문제 ... 안드로이드 L에서 날짜와 시간 선택기가 화면에 맞지 않을 때 ... scrollView .. 이것에 대한 모든 솔루션
— Dominic D' Souza

가로 모드에 맞지 않는 문제 해결 방법
— Awadesh

1
(안드로이드 6.0 이상이 레이아웃은 추한 모습 static.pychat.org/photo/f1qRFo31_Screenshot_20170214-123713.png
— deathangel908에게

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

Android 용 DialogFragment의 DatePicker 및 TimePicker 결합

이를 위해 라이브러리 를 만들었습니다 . 사용자 정의 가능한 색상도 있습니다!

사용이 매우 간단합니다.

먼저 리스너를 만듭니다.

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();

도움이 되셨기를 바랍니다.


정말 좋은 것! 내 시간을 절약! 감사 ! 그러나 gradle 종속성 문자열이 유효하지 않다고 생각하기 때문에 코드를 복제해야했습니다.
— kuldeep

프로젝트의 자식 페이지 @ k2ibegin은 전체 모듈을 가져 오거나 "코드 복제"라고 말합니다. 즉, 그는 어떤 저장소에 자신의 멋진 날짜 시간 선택기를 게시하지 않았습니다. JDJ 좋은 일꾼, 훌륭한 도서관.
— 닌자 코딩

@JDJ 죄송하지만 내 프로젝트에 라이브러리를 추가 할 수 없었습니다. 어떻게 설명 할 수 있습니까?
— Sebastian Delgado

3
1 단계 : "복제 또는 다운로드"를 클릭 한 다음 "다운로드 ZIP"을 클릭하여 전체 프로젝트를 다운로드하십시오. 2 단계 zip 컨텐츠 추출 또는 ZIP \ SlideDateTimePicker-master \ slideDateTimePicker 폴더를 추출한 다음 해당 폴더를 기존 프로젝트의 루트 폴더 컨테이너에 복사 하십시오. 플러그인을 추가하고 싶습니다. 3 단계 : 컴파일 프로젝트 ( ': slideDateTimePicker') 또는 Android Studio : 파일> 새로 만들기> 프로젝트 가져 오기 를 사용 하여 Gradle을 통해 종속성을 추가하고 추출 된 폴더를 선택하고 프로젝트 가져 오기를 구성하고 정상적으로 가져오고 다음을 완료하십시오.
— 닌자 코딩

2
@ JDJ 우리는 Lollipop 또는 Marshmallow에 버그가 있으며 기본 DatePicker를 표시하고 TimePicker는 표시되지 않고 대신 막대 사탕 사전 구성 요소를 보여줍니다.
— 닌자 코딩

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의 솔루션이 요구되는 것이 아니며 두 개의 별도 대화 상자를 여는 데 동의합니다. 이것이 이미 결합 된 기본 샘플 코드를 보는 것이 좋습니다.
— 유진 반 데르 메웨

9

나는 내 프로젝트 중 하나에서 같은 문제에 직면하고 있으며 사용자 친화적 인 대화 상자에서 날짜와 시간 선택기가 모두있는 사용자 정의 위젯을 만들기로 결정했습니다. http://code.google.com/p/datetimepicker/ 에서 예제와 함께 소스 코드를 얻을 수 있습니다 . 이 코드는 Apache 2.0에 따라 라이센스가 부여됩니다.



5

wdullaer / MaterialDateTimePicker 중 하나를 사용할 수 있습니다DatePicker library

  • 먼저 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

또 다른 옵션은 iOS의 UIDatePicker 대화 상자와 매우 가까운 Android-wheel 프로젝트입니다.

그것은 (날짜와 시간을 포함하여) 무엇이든 선택할 수있는 수직 슬라이더를 제공합니다. 가로 슬라이더를 선호하는 경우 Rabi에서 참조하는 DateSlider가 더 좋습니다.


링크가 끊어졌습니다. 여기 android-wheel 포크가 있습니다.
— 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.