DatePickerDialog Holo Styling ist auf Android 7 Nougat fehlgeschlagen

8

Aus unserer Kundennachfrage wollen wir den HOLO-Stil auf dem DatePickerDialog für alle Android OS-Versionen beibehalten. DatePicker auf Android 7

Aber es scheint auf Android 7 nicht richtig zu funktionieren:

DatePicker auf Android 7

Von meiner Implementierung:

%Vor%

Es funktioniert gut für frühere Android 7. Jeder hat das gleiche Problem?

Bearbeitet: Lösung wurde in API 25 behoben Ссылка

    
Trung Le 05.10.2016, 11:44
quelle

3 Antworten

18

Ich benutze DatePickerDialog , um Benutzer auf ihre Geburtstage hinzuweisen. Leider habe ich einige Beschwerden von Benutzern über den Material-Themen-Dialog erhalten, als ich es ausprobiert habe. Daher ist es für mich keine Option, zu diesem Thema zu wechseln: Ich muss mich an den Holo-Dialog halten.

Es stellt sich heraus, dass Android 7.0 mit einem Fehler ausgeliefert wurde: Der Versuch, das Holo-Thema auf dieser Plattform zu verwenden, greift stattdessen auf ein gebrochenes Material-Thema für DatePickerDialog zurück. Sehen Sie diese zwei Fehlerberichte:

Ich habe eine modifizierte Form von dieser Problemumgehung von Jeff Lockhart verwendet, auf die in diesen Fehlerberichten verwiesen wurde:

%Vor%

Was das bedeutet ist:

  • Holen Sie sich das private DatePicker mDatePicker -Feld, das zu diesem Dialog gehört
  • Holen Sie sich das private DatePickerDelegate mDelegate -Feld, das zu diesem Dialog gehört
  • Überprüfen Sie, ob der Delegat nicht bereits eine Instanz von DatePickerSpinnerDelegate ist (der Typ des gewünschten Delegaten)
  • Entfernen Sie alle Ansichten von DatePicker , da sie die Widgets des Materialkalenders sind
  • Erstellen Sie eine neue Instanz von DatePickerSpinnerDelegate und weisen Sie sie dem Feld mDelegate von mDatePicker dieses Dialogfelds zu
  • Initiiere mDatePicker erneut mit Kalenderinformationen und einigen Parametern, um die Spinner aufzublasen

Um diese Problemumgehung zu verwenden, erstelle ich ein ContextThemeWrapper um mein Context , was mir erlaubt ein Thema zu setzen, in diesem Fall Holo:

%Vor%

Hinweise :

  • Dies verwendet Reflektion, um auf private Felder zuzugreifen. Im Allgemeinen ist dies kein robuster Ansatz und Sie können sich nicht darauf verlassen. Ich mildere das Risiko hier, indem ich 1) dies auf eine einzige SDK-Version, v24, beschränke; und 2) das gesamte Bit des Reflektionscodes in einen try {...} catch (Exception e) {/* NOP */} -Block zu legen, so dass, wenn eine der Reflektionen fehlschlägt, nichts passiert und das (leider gebrochene) Standard-Fallback verwendet wird.
  • Die obigen Fehlerberichte behaupten, dass dieses Problem in Android 7.1 (SDK 25) behoben wurde. Ich habe das nicht getestet.
  • Der ursprüngliche Workaround-Code war für TimePickerDialog , der unter einem ähnlichen Problem litt. Ich habe es so geändert, dass es stattdessen mit DatePickerDialog funktioniert, und ich habe die Lösung vereinfacht, damit sie weniger generisch und spezifischer für meinen genauen Anwendungsfall ist. Sie können jedoch die vollständigere Originalversion verwenden und sie nur für Date anstelle von Time .
  • optimieren
savanto 06.12.2016, 06:55
quelle
0

Die Datumsauswahl hat einen eigenen Stil Ссылка

Ich denke du brauchst R.style.Widget.Holo.DatePicker anstatt AlertDialog.THEME_HOLO_LIGHT . Es ist möglich, dass Sie möglicherweise Ihren eigenen leeren Stil erstellen müssen, der @android:style/Widget.Holo.DatePicker als übergeordnetes Element hat und diesen verwendet.

    
Ben 05.10.2016 12:02
quelle
0

Versuchen Sie zu folgen, es funktioniert. Ich habe es getestet. Und es hat keine leeren Lücken.

Auch mDatePickerListener ist mein DatePickerListner, den Sie erstellen können.

%Vor%     
Akshay Taru 15.03.2018 14:46
quelle

Tags und Links