gpt4 book ai didi

android - WebView 如何继承当前 Android 主题的颜色?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:12:14 26 4
gpt4 key购买 nike

这个问题最初是为上周举行的 AndroidDev Office Hours Hangout 发布在 Google Moderator 上的。问题居然直播回答了,可以看看here如果你喜欢。我将它张贴在这里是因为他们似乎对此很感兴趣,在这里我有更多的空间来详细说明。

WebView 通常用于按照作者的 Intent 显示网页内容(如他们在视频群聊中所述)。但我使用 WebView 来显示,不完全是内容本身,而是格式化文本(主要是粗体、斜体、项目符号列表和文本对齐)。使用 WebView(换句话说,使用 HTML/CSS 更容易)比使用一堆 TextView 并保持它们的完美格式要容易得多。

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

在 Android 2.3 之前,AlertDialog 背景始终是黑色的。应用主题是默认的深色还是浅色都没有关系,AlertDialog 仍然是深灰色。这在 Vanilla Android 上。但即使在有皮肤的 Android(Sense、TouchWiz、MotoBlur 等...)上,AlertDialog 始终是深色(对于默认/深色和浅色主题)。

这一切都随着 ICS 发生了变化(它可能在 Honeycomb 上发生了变化,但我没有确认)。默认/深色主题现在有一个深色 AlertDialog,而浅色主题实际上有一个浅色 AlertDialog

由于我在我的应用程序中专门使用浅色主题,因此我可以通过使用不同的 CSS 文件加载 WebView 内容来轻松解决我的问题。 ICS 以下版本的文本颜色为深色,ICS 及以上版本的文本颜色为浅色。如果不是 OEM 皮肤,这将主要解决我的问题。

在他们的 ICS 皮肤版本上,​​他们可能会为 AlertDialog 提供深色/浅色主题。或不。他们更有可能完全按照他们一直在做的那样做,像往常一样提供深色和浅色主题,但对于 AlertDialog 只提供深色版本,无论应用的主题是什么。

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

最终,我的问题是:

那么,我该如何应对呢?如何确保 WebView 上的文本在 AlertDialog 背景下可读?无论 Android 版本、使用的主题或是否由 OEM 换肤...

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

这个提取容易完成吗?它能很好地解决我的问题吗?您还有其他选择吗?

最后一个细节...如果您观看了视频群聊,并且对于真正回答我的人,其中一个人建议注入(inject) CSS。如果我之前不清楚,我不需要那样做。我只需要使用我想要的确切 CSS 构建 WebView 内容字符串,它可以采用从主题中提取的文本颜色。

最佳答案

我认为,为了找到解决方案,我们必须能够确定您的对话框在运行时使用的是什么主题。我假设您没有明确设置主题。这意味着将使用默认对话框主题。以下代码来自 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);
}

现在我们需要找出该主题的主要文本颜色是什么。我们可以这样做(变量 dialog 是对您的对话框的引用):

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

现在我们有了文本颜色,接下来就是将该值注入(inject)到您的 WebView 中。我用以下设备测试了这段代码

运行 Honeycomb 的三星 Galaxy Tab 10.1

  • Theme.Holo.Light 给文字颜色纯黑
  • Theme.Holo 将文本颜色设为纯白色

运行 Gingerbread 的 HTC Sensation

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

运行 Gingerbread 的三星 Galaxy S2

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

ICS 模拟器

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

所以这个方法在所有测试设备上都运行良好。

干杯雷纳德

关于android - WebView 如何继承当前 Android 主题的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9088946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com