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


128

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

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

고마워, 루크

답변:


52

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

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


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

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

13
실제로 답변은 정확하며 업데이트하면 안됩니다. AndroidDateSlider가 존재하더라도 해당 기능을 제공하는 Android에는 아무것도 내장되어 있지 않습니다.
Cristian

4
Google이 비즈니스 응용 프로그램에서 가장 널리 사용되는 컨트롤 중 하나를 지원하지 않는다는 사실에 당황하는 유일한 사람입니까?
l46kok

76

모두 넣어 DatePickerTimePicker레이아웃 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 위젯 TimePickerDatePicker를 직접 사용하십시오 .


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.