Android'de tarih ve saat seçici nasıl oluşturulur? [kapalı]


128

Aynı anda tarihi ve saati seçmeyi sağlayan herhangi bir android widget var mı? Zaten temel zaman seçiciyi ve tarih seçiciyi kullanıyorum .

Ama o kadar seksi ve kullanıcı dostu değiller (buldum). Hem tarih hem de saati içeren bir widget'in olup olmadığını biliyor musunuz?

Çok teşekkürler Luc

Yanıtlar:


52

Android'de bunu sunan yerleşik hiçbir şey yok.

DÜZENLEME: Andriod artık yerleşik seçiciler sunuyor. @Oded cevabı kontrol edin


2
Bu yanıtın bir yıldan daha eski olduğunu biliyorum, ancak bu yanıtın güncellenmesi gerektiğini düşünüyorum. Rabi tarafından aşağıda belirtilen DateSlider kütüphanesi bunun için mükemmel görünüyor.
Stephan Branczyk

Bu cevabın güncellenmesi gerektiğini kabul ediyorum çünkü bu harika bir widget. Bununla birlikte, Rabi'nin işaret ettiği kod zaten biraz modası geçmiş ve bazı kullanımdan kaldırılmış yöntemler içeriyor, örn showDialog. Belki yakında daha güncel bir şey gelecek.
Eugene van der Merwe

13
Aslında cevap doğrudur ve güncellenmemelidir. AndroidDateSlider mevcut olsa bile, Android'de bu özelliği sunan yerleşik hiçbir şey yoktur.
Cristian

4
Google'ın piyasadaki herhangi bir iş uygulamasında en çok kullanılan kontrollerden birini desteklememesi gerçeğine şaşıran tek kişi ben miyim?
l46kok

76

Her iki koyun DatePickerve TimePickerbir düzen 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>

Kod:

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
Harika bir örnek, teşekkürler. Bir nokta ... muhtemelen alertDialog.dismiss () 'e sahip olmak istiyorsunuz; onClick uygulamasının sonunda.
Jonathan

Bu örnekte yıl seçilemez.
lostintranslation

Tek bir sorun ... android L kullanırken tarih ve saat seçicisi ekrana sığmıyor ... bu yüzden lineerLayout'u bir scrollView'a koyuyorum ... Şimdi sorun şu ki, düzenin kaydırıldığı zamanı değiştirmeye çalıştığımda scrollView sayesinde .. Buna herhangi bir çözüm
Dominic D'Souza

lütfen yardım edin, manzara moduna uygun değil, nasıl düzeltilir
Awadesh

1
Android 6.0+ bu düzen çirkin görünüyor; ( static.pychat.org/photo/f1qRFo31_Screenshot_20170214-123713.png
deathangel908

64

Bu işlevi kullanın, tarih ve saati birer birer resmetmenizi ve ardından bunu global değişken tarihe ayarlamanızı sağlar. Kitaplık yok XML yok.

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

En basit yollardan biri
Vicky Thakor

3
Çağrı, API seviyesi 24'ü gerektirir.
RRaj

27

Android için DialogFragment'da birleştirilmiş DatePicker ve TimePicker

Bunu yapmak için bir kütüphane oluşturdum . Ayrıca özelleştirilebilir renklere sahiptir!

Kullanımı çok basit.

Önce bir dinleyici oluşturursunuz:

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

Ardından iletişim kutusunu oluşturup gösterirsiniz:

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

Umarım yararlı bulursunuz.


gerçekten iyi biri! zamanımı kurtardım! Teşekkürler ! Ancak, kodu klonlamak zorunda kaldım, çünkü gradle bağımlılık dizesinin geçerli olmadığını düşünüyorum.
kuldeep

@ k2ibegin projenin git sayfası, tüm modülü içe aktarmayı veya "kodu klonla" diyor, asıl nokta bu, harika tarih-saat seçicisini herhangi bir depoda yayınlamadı. JDJ iyi iş adam, harika kitap.
Ninja Coding

@JDJ üzgünüm ama kütüphanenizi projeme ekleyemedim, nasıl olduğunu açıklar mısınız?
Sebastian Delgado

3
Adım 1 "Klonla veya indir" i ve ardından "ZIP dosyasını indir" i tıklayarak tüm projeyi indirin Adım 2 zip içeriğini veya yalnızca ZIP \ SlideDateTimePicker-master \ slideDateTimePicker klasörünü çıkarın ve bu klasörü mevcut projenizin kök klasör kabına kopyalayın. eklentiyi eklemek istiyorsunuz. Adım 3 Derleme projesiyle (': slideDateTimePicker') VEYA Android Studio ile Gradle aracılığıyla Bağımlılığı ekleyin : Dosya> Yeni> Projeyi İçe Aktar ve çıkarılan klasörü seçin ve proje içe aktarmayı normalde kabul edin ve sonra tamamlayın.
Ninja Coding

2
@JDJ bir hatamız var, Lollipop veya Marshmallow'da yerel DatePicker ve TimePicker gösterilmiyor, bunun yerine lolipop öncesi bileşenleri gösteriyor.
Ninja Coding

20

DatePickerGüncelleme zamanı yönteminde zaman seçici iletişim kutusunu çağırın . Aynı anda çağrılmaz, ancak DatePickerset düğmesine bastığınızda. Zaman seçici iletişim kutusu açılacaktır. Yöntem aşağıda verilmiştir.

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 aşağıda verilmiştir

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

Ayrıca bir DatePicker ve TimePicker'ı birleştirmek istedim. Bu yüzden ikisini de tek bir arayüzde işlemek için bir API yaratıyorum! :)

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

görüntü açıklamasını buraya girin

SublimePicker'ı da kullanabilirsiniz


Çok güzel ve zarif bir çözüm. Harika çalışıyor. Karşılaştığım birkaç küçük ayrıntı .. 1) ÖÖ / ÖS etiketi kesiliyordu, bu yüzden stil olarak daha küçük bir yazı tipi boyutu ayarlamak zorunda kaldım: <item name="android:textSize">11sp</item> ve kalın ayarı kaldırın. 2) setDefaultDateTime(..)çağrılması gerekiyor gibi görünüyor veya bir çalışma zamanı istisnası alıyorsunuz .. bu yüzden bunu Calendar.getInstance().getTime()parametre olarak çağırıyorum . Şimdiye kadar gördüğüm bir tarih seçici için en iyi github projesi - paylaştığınız için teşekkürler
Gene Bo

13

Bağlandığınız URL'ler, bir zaman seçici ve tarih seçicili başka bir iletişim kutusunun nasıl açıldığını gösterir. Ancak, bu UI widget'larını doğrudan kendi düzeninizde kullanabileceğinizi bilmeniz gerekir. Aynı görünümde hem TimePicker hem de DatePicker içeren kendi diyaloğunuzu oluşturabilir, böylece aradığınızı düşündüğüm şeyi başarabilirsiniz.

Başka bir deyişle, TimePickerDialog ve DatePickerDialog'u kullanmak yerine, doğrudan kendi iletişim kutunuzda veya etkinliğinizde TimePicker ve DatePicker arayüz araçlarını kullanın .


1
Katılıyorum @Jaydeep Khamar'ın çözümü istenen şey değil, bunlar iki ayrı diyalog açıyor. Bunun zaten birleştirildiği temel örnek kodu görmek daha iyi olacaktır.
Eugene van der Merwe

9

Projelerimden birinde aynı sorunla karşılaşıyordum ve kullanıcı dostu bir iletişim kutusunda hem tarih hem de zaman seçiciye sahip özel bir pencere öğesi oluşturmaya karar verdim. Kaynak kodunu http://code.google.com/p/datetimepicker/ adresinden bir örnekle birlikte alabilirsiniz . Kod, Apache 2.0 altında lisanslanmıştır.



5

Wdullaer / MaterialDateTimePicker birini kullanabilirsinizDatePicker library

  • İlk gösteri 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:");
    }
  • Sonra 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);
    }
  • Açık onTimeSet callbackmağaza süre

     @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

Diğer bir seçenek, iOS'un UIDatePicker iletişim kutusuna oldukça yakın gelen android tekerlek projesidir.

Herhangi bir şeyi (tarih ve saat dahil) seçmek için dikey bir kaydırıcı sağlar. Yatay kaydırıcıyı tercih ederseniz, Rabi tarafından atıfta bulunulan DateSlider daha iyidir.


Kırık bağlantı. İşte android çarkından bir çatal .
jk7


1

Tarih seçici ve Saat seçiciyi birleştiren bir uyarı iletişim kutusu oluşturdum. Kodu https://github.com/nguyentoantuit/android adresinden alabilirsiniz Not: DateTimePicker bir kitaplıktır


1
Not o bağlantı sadece cevaplar tavsiye edilmez, SO cevaplar çözüm (vs. henüz zamanla bayat almak eğilimindedir referanslar, başka mola) için bir aramanın son nokta olmalıdır. Lütfen bağlantıyı referans olarak koruyarak buraya bağımsız bir özet eklemeyi düşünün.
kleopatra

1

İşte Jaydeep'in birbiri ardına diyalogları gösterme fikrinin daha kompakt bir versiyonu. Bu çözümü seviyorum çünkü bağımlılıkları yok.

        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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.