10

这个问题最初是在上周举行的 AndroidDev Office Hours Hangout 的 Google 版主上发布的。这个问题实际上是现场回答的,如果你愿意,你可以在这里观看。我把它贴在这里是因为他们似乎对它很感兴趣,在这里我有更多的空间来详细说明。

AWebView通常用于按作者的意图显示 Web 内容(正如他们在环聊中所说的那样)。但我使用 aWebView来显示的不是内容本身,而是格式化的文本(主要是粗体、斜体、项目符号列表和文本对齐方式)。使用 a WebView(换句话说,使用 HTML/CSS 更容易)比使用一堆 TextView 并保持其完美格式要容易得多。

问题是我WebViewAlertDialog. 文本颜色来自加载的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。如果我之前不清楚,我不需要这样做。我只需要WebView使用我想要的确切 CSS 构建内容字符串,它可以采用从主题中提取的文本颜色。

4

1 回答 1

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);
    }

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

    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

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

HTC Sensation 运行 Gingerbread

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

运行 Gingerbread 的三星 Galaxy S2

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

ICS 仿真器

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

因此,这种方法在所有测试设备上都运行良好。

干杯雷纳德

于 2012-03-25T21:20:42.300 回答