Diese Frage wurde ursprünglich in Google Moderator für den AndroidDev Office Hours Hangout, der letzte Woche stattfand, veröffentlicht. Die Frage wurde tatsächlich live beantwortet und Sie können es sich hier ansehen, wenn Sie möchten. Ich poste es hier, weil sie davon fasziniert schienen und hier habe ich ein bisschen mehr Platz zum Ausarbeiten.
A WebView
wird normalerweise verwendet, um Webinhalte so anzuzeigen, wie der Autor es beabsichtigt hat (wie sie im Hangout angeben). Aber ich verwende ein WebView
, um nicht nur Inhalt an sich anzuzeigen, sondern formatierten Text (hauptsächlich Fett-, Kursiv-, Aufzählungslisten und Textausrichtung). Es ist viel einfacher mit WebView
(mit anderen Worten, viel einfacher mit HTML / CSS) als eine Reihe von TextViews zu verwenden und alles perfekt formatiert zu halten.
Das Problem ist, dass ich dieses spezifische WebView
mit einem transparenten Hintergrund auf einem AlertDialog
verwende. Die WebView
-Textfarbe kommt vom geladenen CSS-Inhalt, aber es ist wichtig, dass diese Farbe mit der Hintergrundfarbe von AlertDialog
kontrastiert. Und das ist mein Problem.
Bis Android 2.3 war der AlertDialog
Hintergrund immer dunkel. Es war egal, ob das App-Theme das Standard-Dark oder das Light-Thema war, das AlertDialog
war immer noch dunkelgrau. Dies auf Vanille Android. Aber selbst auf gehäutetem Android (Sense, TouchWiz, MotoBlur, etc ...) war die AlertDialog
immer eine dunkle Farbe (sowohl für die Standard- als auch die dunklen und hellen Themen).
Das alles hat sich mit ICS geändert (es hat sich wahrscheinlich bei Honeycomb geändert, aber das habe ich nicht bestätigt). Das Standard / Dunkel-Thema hat jetzt ein dunkles AlertDialog
, während das Licht-Thema tatsächlich ein Licht AlertDialog
hat.
Da ich ausschließlich das Light Theme meiner App verwende, könnte ich mein Problem leicht lösen, indem ich den WebView
Inhalt mit verschiedenen CSS Dateien lade. Eine mit dunkler Textfarbe für Versionen unter ICS und eine andere helle Textfarbe für ICS und höher. Dies würde mein Problem meist lösen, wenn es keine OEM-Skins gäbe.
In ihren Skin-Versionen für ICS könnten sie dunkle / helle Themen für AlertDialog
enthalten. Oder nicht. Sie tun es eher, haben es getan, bieten wie üblich dunkle und helle Themen, aber für die AlertDialog
nur eine dunkle Version, egal welches Thema die App hat.
Ich könnte Holo
in meiner App erzwingen und das Problem auf diese Weise lösen, aber ich würde es vorziehen, nicht zu stören, wie das Gesamtsystem auf den Geräten des Benutzers aussieht. Zum Beispiel, wenn sie Sinn haben und es wirklich mögen, möchte ich kein Holo
theme AlertDialog
anzeigen, wenn ich meine App benutze.
Letztendlich ist meine Frage:
Also, wie komme ich damit klar? Wie stelle ich sicher, dass der Text auf meinem WebView
für den AlertDialog
Hintergrund lesbar ist? Egal ob Android-Version, verwendetes Design oder ob es von OEMs gehackt wird oder nicht ...
Ich weiß nicht, wie machbar das ist, aber eine Alternative, um dieses Problem zu lösen, wäre, irgendwie die Textfarbe aus dem AlertDialog
-Thema im Gerät zu extrahieren. Aber nicht das Standardthema oder das Holo
Theme, sondern das DeviceDefault
Theme, glaube ich.
Ist diese Extraktion einfach durchzuführen? Könnte es eine gute Lösung für mein Problem sein? Hast du noch andere Alternativen?
Ein letztes Detail ... Wenn Sie sich den Hangout und die Leute angesehen haben, die mir geantwortet haben, hat einer von ihnen vorgeschlagen, CSS einzufügen. Wenn ich vorher nicht klar war, muss ich das nicht tun. Ich muss nur die WebView
content-Zeichenfolge mit genau dem CSS erstellen, das ich möchte, das die aus dem Thema extrahierte Textfarbe annehmen kann.
Ich denke, um eine Lösung zu finden, müssen wir bestimmen können, welches Thema zur Laufzeit von Ihren Dialogen verwendet wird. Ich nehme an, dass Sie kein Thema explizit festlegen. Das bedeutet, dass das Standarddialogthema verwendet wird. Der folgende Code stammt aus der Klasse Dialog und zeigt, wie das Standarddesign tatsächlich auf ein Dialogfeld angewendet wird, wenn ein Thema nicht explizit festgelegt wurde.
%Vor%Jetzt müssen wir herausfinden, was die primäre Textfarbe des Themas ist. Wir können es so machen (der variable Dialog ist ein Verweis auf Ihren Dialog):
%Vor%Jetzt, da wir die Textfarbe haben, ist es wichtig, diesen Wert in Ihre Webansicht zu übertragen. Ich habe diesen Code mit folgenden Geräten getestet:
Samsung Galaxy Tab 10.1 läuft Honeycomb
HTC Sensation läuft Lebkuchen
Samsung Galaxy S2 mit Lebkuchen
ICS-Emulator
Diese Methode hat also bei allen getesteten Geräten funktioniert.
Prost Renard
Tags und Links android android-webview colors android-theme android-alertdialog