WebView如何inheritance当前Android主题的颜色?

这个问题最初发布在上周发生的AndroidDev Office Hours Hangout的Google版主上。 这个问题实际上是现场回答的,如果你喜欢,你可以在这里看。 我在这里发表,因为他们似乎对它感兴趣,在这里我有一点点的空间来阐述。

WebView通常用于显示Web内容(如他们在环聊中所述)。 但是,我使用WebView来显示,不完全是内容本身,而是格式化的文本 (主要是粗体,斜体,项目符号列表和文本alignment)。 使用WebView (换句话说,使用HTML / CSS更容易)比使用一堆TextViews并且保持格式完整。

问题是我在AlertDialog上使用具有透明背景的特定WebViewWebView文本颜色来自加载的内容CSS,但重要的是此颜色与AlertDialog的背景颜色形成鲜明对比。 这是我的问题。

直到Android 2.3, AlertDialog背景总是很暗。 如果应用程序主题是默认的黑色或轻的,那么AlertDialog仍然是深灰色。 这在香草Android上。 但即使在皮肤上的Android(Sense,TouchWiz,MotoBlur等) AlertDialog一直是一个黑暗的颜色(默认/黑暗和光主题)。

这一切都改变了ICS(它可能改变了蜂窝,但我没有证实)。 默认/黑暗主题现在有一个黑色的AlertDialog而灯光主题实际上有一个轻的AlertDialog

由于我只在应用程序中使用轻量级主题,因此可以通过使用不同的CSS文件加载WebView内容来轻松解决问题。 一个用于低于ICS的黑​​体文本颜色,另一个用于ICS及以上版本的低文本颜色。 如果不是OEM皮肤,这将主要解决我的问题。

在他们的ICS皮肤版本上,​​他们可能会为AlertDialog提供暗/主题。 或不。 他们更可能做到这一点,像往常一样提供黑暗和光明的主题,但对AlertDialog只有一个黑暗的版本,不pipe应用程序的主题。

我可以强制Holo在我的应用程序上,并解决了这个问题,但我不希望干扰整个系统在用户设备上的显示效果。 例如,如果他们有Sense并且非常喜欢, AlertDialog在使用我的应用程序时,我不想显示Holo主题的AlertDialog

最终,我的问题是这样的:

那么,我该如何处理呢? 我如何确保我的WebView上的文本是可读的AlertDialog背景? 无论是Android版本,正在使用的主题还是原始设备制造商剥皮的主题…

我不知道这是多么可行,但解决这个问题的一个替代方法是以某种方式从设备中的AlertDialog主题中提取文本颜色。 但不是默认的主题或Holo主题,但我相信DeviceDefault主题。

这个提取是否容易完成? 这是否能解决我的问题? 你有其他的select吗?

最后一个细节…如果你看了聚会和那些真正回答我的人,其中一个人build议注入CSS。 如果我以前不清楚,我不需要那样做。 我只需要用我想要的确切的CSS构buildWebView内容string,它可以从主题中提取文本颜色。

Solutions Collecting From Web of "WebView如何inheritance当前Android主题的颜色?"

我认为,为了find一个解决scheme,我们必须能够确定在对话框运行时使用什么主题。 我假设你没有设置主题明确。 这意味着将使用默认的对话框主题。 以下代码来自Dialog类,它显示了如果未明确设置主题,默认主题实际上应用于对话框的方式。

 Dialog(Context context, int theme, boolean createContextWrapper) { if (theme == 0) { TypedValue outValue = new TypedValue(); context.getTheme().resolveAttribute(com.android.internal.R.attr.dialogTheme, outValue, true); theme = outValue.resourceId; } mContext = createContextWrapper ? new ContextThemeWrapper(context, theme) : context; mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); Window w = PolicyManager.makeNewWindow(mContext); mWindow = w; w.setCallback(this); w.setWindowManager(mWindowManager, null, null); w.setGravity(Gravity.CENTER); mUiThread = Thread.currentThread(); mListenersHandler = new ListenersHandler(this); } 

现在我们需要找出那个主题的主要文字颜色。 我们可以这样做(variables对话框是对你的对话框的引用):

  TypedValue tv = new TypedValue(); dialog.getContext().getTheme().resolveAttribute(android.R.attr.textColorPrimary, tv, true); int textColor = getResources().getColor(tv.resourceId); 

现在,我们有文字颜色,这是一个注入到你的web视图的价值的问题。 我用以下设备testing了这个代码

三星Galaxy Tab 10.1运行蜂窝

  • Theme.Holo.Light给文本颜色纯黑色
  • Theme.Holo给文本颜色纯白色

HTC Sensation运行姜饼

  • Theme.Light提供了一个纯白色的文本颜色(这是正确的,因为对话框有一个黑色的背景
  • Theme.Black也给了纯白色的文字颜色

三星Galaxy S2运行姜饼

  • Theme.Black给了浅灰色的文字颜色(ffc8c8c8)
  • Theme.Light给了相同的文字颜色(ffc8c8c8)

ICS仿真器

  • Theme.Holo.Light给了纯黑色的文字颜色
  • Theme.Holo给了一个很浅的灰色(fff3f3f3)

所以这个方法在所有的testing设备上都能正常工

干杯雷纳德