2015-02-26 5 views
26

Ich lese die Dokumentation: http://developer.android.com/guide/topics/ui/controls/pickers.html aber jetzt in Lollipop erscheint der Kalender (es ist in Ordnung für ein Ereignis, aber schrecklich für ein Geburtsdatum festlegen, würde ich einen Spinner-Modus.) Und ich kann es nicht entfernen! In Layout Es ist einfach, mit dieser Eigenschaft:Datepicker Dialog ohne Kalender Visualisierung in Lollipop [Spinner-Modus]?

<DatePicker 
datePickerMode="spinner"...> 

aber aus dem Code des DatePickerDialog wenn ich versuche,

dialogDatePicker.getDatePicker().setSpinnersShown(true); 
dialogDatePicker.getDatePicker().setCalendarViewShown(false); 

diese Eigenschaften funktionieren nicht gesetzt und der Kalender weiterhin angezeigt!

public static class MyDatePicker extends DialogFragment implements DatePickerDialog.OnDateSetListener { 
     int pYear; 
     int pDay; 
     int pMonth; 

     @Override 
     public Dialog onCreateDialog(Bundle savedInstanceState) { 
      // Use the current date as the default date in the picker 
      final Calendar c = Calendar.getInstance(); 
      int year = c.get(Calendar.YEAR); 
      int month = c.get(Calendar.MONTH); 
      int day = c.get(Calendar.DAY_OF_MONTH); 
      DatePickerDialog dialogDatePicker = new DatePickerDialog(getActivity(), this, year, month, day); 
      dialogDatePicker.getDatePicker().setSpinnersShown(true); 
      dialogDatePicker.getDatePicker().setCalendarViewShown(false); 
      return dialogDatePicker; 
      // Create a new instance of DatePickerDialog and return it 
      //return new DatePickerDialog(getActivity(), this, year, month, day); 
     } 

     public void onDateSet(DatePicker view, int year, int month, int day) { 
      pYear = year; 
      pDay = day; 
      pMonth = month; 
     } 
    } 
+2

versuchen setzen 'android: calendarViewShown = "false"' in xml – Apurva

+1

Dieser dupliziert: Sehen Sie die Antwort hier: http: // Stackoverflow. com/a/31610267/1887635 – Luismi

Antwort

2

können Sie versuchen, diese

DatePickerDialog dialogDatePicker = new DatePickerDialog(getActivity(), this, year, month, day); 
      dialogDatePicker.getDatePicker().setCalendarViewShown(false); 
      return dialogDatePicker; 

Entfernen

dialogDatePicker.getDatePicker().setSpinnersShown(true); 
+2

Nein, funktioniert nicht! :(jetzt verwende ich datepicker directy in der xml. – Evilripper

1

das Probieren Sie es für mich gearbeitet, führen Sie eine benutzerdefinierte datelistener:

@SuppressWarnings("deprecation") 
    public void setDate(View view) { 
     showDialog(999); 
    } 

    @SuppressWarnings("deprecation") 
    protected Dialog onCreateDialog(int id) { 
     // TODO Auto-generated method stub 
     if (id == 999) { 
      return new DatePickerDialog(this, myDateListener, year, month-1, day); 
     } 
     return null; 
    } 
    //THIS 
    private DatePickerDialog.OnDateSetListener myDateListener= new DatePickerDialog.OnDateSetListener() { 

     @Override 
     public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) { 

      showDate(arg1, arg2+1, arg3); 
     } 
    }; 

    private void showDate(int year, int month, int day) { 

     //dateView.setText(new StringBuilder().append(day).append("-") 
       // .append(month).append("-").append(year)); 
    } 
+0

Mmm werde ich versuchen ... aber jetzt verwende ich datepicker ohne dialog. – Evilripper

41

DatePickerDialog verwendet das Dialogdesign spezifiziert durch Ihr Aktivitätsthema. Dies ist ein vollständig spezifiziertes Design, das bedeutet, dass Sie alle Attribute neu festlegen müssen, die Sie in Ihrem Aktivitätsthema festgelegt haben, z. B. den Datumsauswahlstil.

<style name="MyAppTheme" parent="android:Theme.Material"> 
    <item name="android:dialogTheme">@style/MyDialogTheme</item> 
    <item name="android:datePickerStyle">@style/MyDatePicker</item> 
</style> 

<style name="MyDialogTheme" parent="android:Theme.Material.Dialog"> 
    <item name="android:datePickerStyle">@style/MyDatePicker</item> 
</style> 

<style name="MyDatePicker" parent="android:Widget.Material.DatePicker"> 
    <item name="android:datePickerMode">spinner</item> 
</style> 

Hinweis: Aufgrund Issue 222208, wird dies nicht in Android N/API funktionieren 24. Es hat sich bereits in der Plattform für die nächste Version behoben. Es ist keine Problemumgehung für API 24-Geräte verfügbar.

+2

Nur so funktioniert das un ein fragment, danke. Jetzt, um herauszufinden, wie es funktioniert beide unter und über api v21. – gatnowurry

+0

Vielen Dank, habe meine Zeit gespeichert – mdDroid

+0

@alanv Wenn ich das obige 'MyDialogTheme' für' DatePickerDialog' anwende, sind die 'OK' und' CANCEL' Buttons blau. Wie kann ich diese Farbe ändern? –

2

Alle ausgefallenen Sachen beiseite, verwenden Sie den DatePickerDialog-Konstruktor, der einen "int-Thema" -Parameter nimmt. Ohne es scheint es standardmäßig zu dem, was int es im CalendarView-Modus setzt. Mit kleinen Ganzzahlen (0, 1, 2, 3 ...) gibt es Ihnen einen Spinner (zumindest in meiner API 19 App auf einem Emulator ausgeführt). Grundsätzlich versuchen neue DatePickerDialog (getContext(), 0, diesem, Jahr, Monat, Tag) die Mitteilung 0 (oder 1 oder 2, usw.) gibt

Vorsicht: Ich bin mir nicht sicher, ob es eine Liste irgendwo mit statischen Themenfeldern, und die Verwendung einer fest codierten "0" anstelle von "Theme.HOLO_LIGHT" oder was auch immer auf verschiedenen Geräten einen Unterschied machen könnte, aber es macht den Job irgendwie fertig.

33

Anwenden der Holo_theme in der Code-Ebene hat für mich gearbeitet.

new DatePickerDialog(getActivity(),android.R.style.Theme_Holo_Dialog,this, year,month, day); 
+3

Es hat nicht funktioniert für mich auf API 24 –

+3

Große Antwort! android.R.style.Theme_Holo_Light_Dialog sieht jedoch viel besser aus – Nativ

+0

@WaqasRaja Gleiches Problem .. haben Sie irgendeine Lösung gefunden? – iMDroid

5

das Attribut calendarViewShown hinzufügen und es auf false gesetzt:

<DatePicker 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:id="@+id/date_field" 
android:calendarViewShown="false"/> 
5

Ich denke, die beste Lösung für dieses Problem ist es, einen neuen Stil in der XML-Datei definieren und sie dann in dem Code programmatisch verwenden.

Obwohl @alanv answer ist perfekt und wird richtig funktionieren, das Problem damit ist, dass es für alle Date-Picker angewendet wird. Angenommen, Sie haben einen DatePicker, auf dem Sie die Kalenderansicht anzeigen müssen, und einen anderen DatePicker, an dem Sie die Spinner-Ansicht anzeigen müssen. Dies funktioniert nicht.

Definieren Sie einen neuen Stil in einer styles.xml. Erstellen Sie diese Datei in einem Ordner mit dem Namen values-v21 (siehe Benennungsstruktur here), da diese Attribute nur nach dem Lollipop eingeführt werden. Vor dem Lollipop gab es nur den Spinner-Modus.

<style name="CustomDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog"> 
    <item name="android:datePickerStyle">@style/MyDatePickerStyle</item> 
</style> 

<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.DatePicker"> 
    <item name="android:datePickerMode">spinner</item> 
</style> 

Schließlich verwenden es in dem Code wie folgt

DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), 
    R.style.CustomDatePickerDialogTheme, this, year, month, day); 
return datePickerDialog; 
0

Datepicker Methoden im Zusammenhang mit zeigen spinner und/oder Kalenderansicht von der API-Ebene 24. Verfahren setSpinnersShown veraltet (boolean gezeigt) und setCalendarViewShown (Boolescher Wert) ist veraltet, da der Material-Stil des Kalendermodus das Feature nicht unterstützt.

Wenn Sie den Materialstil im Spinner-Modus verwenden möchten, verwenden Sie das DatePicker-Widget.

Wenden Sie unter Stil auf Ihre Datumsauswahl Xml-Element, um Material Spinner zu erhalten. Weitere Informationen zu Datumsauswahl und Stilen finden Sie unter http://www.zoftino.com/android-datepicker-example.

<style name="MyDatePickerSpinnerStyle" parent="@android:style/Widget.Material.DatePicker"> 
    <item name="android:datePickerMode">spinner</item> 
    <item name="android:calendarViewShown">false</item> 
    <item name="colorControlNormal">#d50000</item> 
</style> 
1

können Sie eine Bibliothek verwenden, um den alten "Spinner" Stil Datepicker zu schaffen, die drei nur Number zusammen:

https://github.com/drawers/SpinnerDatePicker

spinner date picker

Zunächst definieren einen Stil:

<style name="NumbePickerStyle"> 
    <item name="android:textSize">22dp</item> 
    <item name="android:textColorPrimary">@color/colorAccent</item> 
    <item name="android:colorControlNormal" tools:targetApi="lollipop">@color/colorAccent</item> 
</style> 

Dann,

new SpinnerDatePickerDialogBuilder() 
     .context(MainActivity.this) 
     .callback(MainActivity.this) 
     .spinnerTheme(spinnerTheme) 
     .year(year) 
     .monthOfYear(monthOfYear) 
     .dayOfMonth(dayOfMonth) 
     .build() 
     .show(); 

Disclaimer: Ich bin der Autor dieser Bibliothek

Verwandte Themen