Wie kann ein WebView Farben aus dem aktuellen Android-Thema erben?

9

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.

    
Ricardo Amaral 01.02.2012, 00:07
quelle

1 Antwort

3

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

  • Theme.Holo.Light gab der Textfarbe reines Schwarz
  • Theme.Holo gab der Textfarbe reines Weiß

HTC Sensation läuft Lebkuchen

  • Theme.Light gab eine Textfarbe von reinem Weiß (das ist korrekt seit Der Dialog hat einen dunklen Hintergrund
  • Theme.Black gab auch eine Textfarbe von reinem Weiß

Samsung Galaxy S2 mit Lebkuchen

  • Theme.Black gab eine hellgraue Textfarbe (ffc8c8c8)
  • Theme.Light gab dieselbe Textfarbe (ffc8c8c8)

ICS-Emulator

  • Theme.Holo.Light gab eine Textfarbe von reinem Schwarz
  • Theme.Holo gab ein sehr helles Grau (fff3f3f3)

Diese Methode hat also bei allen getesteten Geräten funktioniert.

Prost Renard

    
Renard 25.03.2012, 21:20
quelle