这个问题最初是在上周的AndroidDev办公时间大会上发布的。这个问题实际上是现场回答的,如果你愿意的话,你可以看here。我把它张贴在这里,因为他们似乎对它感兴趣,在这里,我有一个更多的空间来阐述。
WebView通常用于按作者的意愿显示web内容(如作者在hangout中所述)。但我使用WebView来显示内容本身,但使用格式的文本(主要是粗体、斜体、符号列表和文本对齐)。使用WebView (换句话说,使用HTML/CSS)要比使用一堆TextViews并将其保持完美的格式化要容易得多。
问题是,我使用的是这个特定的WebView,在AlertDialog上有一个透明的背景。WebView文本颜色来自已加载的内容CSS,但这种颜色与AlertDialog的背景色形成对比非常重要。这就是我的问题。
直到Android2.3,AlertDialog的背景一直是黑暗的。应用程序的主题是默认的暗的还是亮的,这并不重要,AlertDialog仍然是深灰色的。这个用的是香草机器人。但是即使是在皮肤上的安卓(Sense,TouchWiz,MotoBlur,等等)AlertDialog一直是深色的(对于默认的/暗的和光的主题)。
这一切都改变了ICS (它可能改变了蜂窝,但我没有证实这一点)。默认/暗主题现在有一个暗AlertDialog,而光明主题实际上有一个轻型AlertDialog。
由于我在我的应用程序中只使用轻量级的主题,所以我可以轻松地用不同的CSS文件加载WebView内容来解决我的问题。在ICS下面的版本中,带有黑色文本颜色,ICS和更高的版本具有anothr浅色文本颜色。这主要是解决我的问题,如果不是因为原始设备制造商的皮肤。
在他们为ICS的皮肤版本中,他们可能为AlertDialog提供暗/亮的主题。或者不是。他们更有可能做的正是他们一直这样做,提供黑暗和光明的主题,但对AlertDialog只有一个黑暗的版本,无论应用的主题。
我可以在我的应用程序上强制使用Holo,并以这种方式解决问题,但我不想干涉用户设备上整个系统的外观。例如,如果他们有理智和真正喜欢它,我不想在使用我的应用程序时显示一个Holo主题的AlertDialog。
最后,我的问题是:
那么,我该如何处理这个问题呢?如何确保我的WebView AlertDialog 上的文本在AlertDialog背景下是可读的?无论安卓版本,主题正在使用,如果它是由原始设备制造商或不.
我不知道这是否可行,但是解决这个问题的另一种方法是从设备中的AlertDialog主题中提取文本颜色。但不是默认主题或Holo主题,而是DeviceDefault主题,我相信。
这种提取容易吗?这能解决我的问题吗?你还有别的选择吗?
最后一个细节..。如果你看了这里的活动,并给那些真正回答我的人,他们中的一个建议注射CSS。如果我之前不清楚,我就不需要那么做了。我只需要构建WebView内容字符串与我想要的确切的CSS,这可以采取的文本颜色提取的主题。
发布于 2012-03-25 21:20:42
我认为,为了找到解决方案,我们必须能够确定您的对话框在运行时使用的主题。我假设您没有设置主题说明。这意味着将使用默认的对话框主题。下面的代码来自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);现在我们有了文本颜色,这是一个将该值注入到您的we视图中的问题。我用以下设备测试了这段代码
三星GalaxyTab10.1运行蜂窝
HTC感觉运行姜饼
background
也给出了纯白的文本颜色)。
三星Galaxy S2运行姜饼
(ffc8c8c8)
ICS仿真程序
因此,这种方法在所有被测试的设备上都很有效。
雷纳德干杯
https://stackoverflow.com/questions/9088946
复制相似问题