此问题最初发布于Google Moderator上,发布于上周举行的AndroidDev办公时间环聊。这个问题实际上是现场回答的,如果你愿意,你可以看here。我在这里张贴它因为它们似乎对它很感兴趣而且我在这里有更多的空间来详细阐述。
WebView
通常用于显示作者想要的网页内容(因为他们在环聊中说明)。但我使用WebView
来显示内容本身并不完全是内容,而是格式化文本(主要是粗体,斜体,项目符号列表和文本对齐)。使用WebView
(换句话说,使用HTML / CSS更容易)比使用一堆TextView并使其保持完美格式化要容易得多。
问题在于我在WebView
上使用了具有透明背景的特定AlertDialog
。 WebView
文本颜色来自加载的内容CSS,但重要的是此颜色与AlertDialog
的背景颜色形成对比。那是我的问题。
直到Android 2.3,AlertDialog
背景始终是黑暗的。如果应用主题是默认的暗色或浅色,无关紧要,AlertDialog
仍然是深灰色。这个在香草Android上。但即使在蒙皮的Android(Sense,TouchWiz,MotoBlur等......)上,AlertDialog
也一直是暗色(对于默认/暗色和浅色主题)。
这一切都随着ICS而改变(它可能在Honeycomb上有所改变,但我没有证实)。默认/黑暗主题现在有一个黑色AlertDialog
,而灯光主题实际上有一个亮AlertDialog
。
由于我专门在我的应用上使用灯光主题,因此我可以通过将WebView
内容加载到不同的CSS文件来轻松解决我的问题。一种是深色文本颜色,适用于ICS以下版本,另一种是浅色文本颜色,适用于ICS及以上版本。如果不是OEM皮肤,这将主要解决我的问题。
在他们的ICS皮肤版本中,他们可能会为AlertDialog
提供深色/浅色主题。或不。他们更有可能做到这一点,像往常一样提供黑暗和明亮的主题,但AlertDialog
只有黑暗版本,无论应用程序的主题。
我可以在我的应用上强制Holo
并解决问题,但我不想干扰整个系统在用户设备上的外观。例如,如果他们有Sense并且非常喜欢它,我不想在使用我的应用时显示Holo
主题AlertDialog
。
最终,我的问题是:
那么,我该如何应对呢?如何确保WebView
上的文字在AlertDialog
背景下可读?无论是Android版本,还是正在使用的主题,或者它是否被OEM剥离......
我不知道这有多可行,但解决此问题的另一种方法是以某种方式从设备中的AlertDialog
主题中提取文本颜色。但不是默认主题或Holo
主题,而是我认为的DeviceDefault
主题。
这个提取很容易吗?它能解决我的问题吗?你有其他选择吗?
最后一个细节......如果您观看了视频群聊以及实际回复我的人,其中一人建议注入CSS。如果我以前不清楚,我不需要这样做。我只需要使用我想要的确切CSS构建WebView
内容字符串,它可以采用从主题中提取的文本颜色。
答案 0 :(得分:3)
我认为为了找到解决方案,我们必须能够确定对话框在运行时使用的主题。我假设你没有设置主题明确性。这意味着将使用默认对话框主题。以下代码来自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);
}
现在我们需要找出该主题的主要文本颜色。我们可以这样做(变量对话框是对话框的引用):
TypedValue tv = new TypedValue();
dialog.getContext().getTheme().resolveAttribute(android.R.attr.textColorPrimary, tv, true);
int textColor = getResources().getColor(tv.resourceId);
现在我们有了文本颜色,这就是将这个值注入你的webview的问题。 我使用以下设备测试了此代码
运行Honeycomb的三星Galaxy Tab 10.1
运行Gingerbread的HTC Sensation
三星Galaxy S2运行Gingerbread
ICS模拟器
因此,这种方法适用于所有经过测试的设备。
干杯 雷纳德