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

Ric*_*ral 10 android colors android-webview android-theme android-alertdialog

此问题最初发布在谷歌版主上,用于上周举行的AndroidDev办公时间环聊.问题实际上是现场回答,如果你愿意,你可以在这里观看.我在这里发帖,因为他们似乎对它很感兴趣,而且我有更多的空间来详细阐述.

A WebView通常用于显示作者想要的Web内容(如他们在环聊中所述).但我使用a WebView来显示,不仅仅是内容本身,而是格式化文本(主要是粗体,斜体,项目符号列表和文本对齐).这是一个容易得多WebView(换句话说,更容易使用HTML/CSS),而不是用一堆TextViews,并保持这一切完全格式化.

问题是我正在使用这个特定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.如果我以前不清楚,我不需要这样做.我只需要用WebView我想要的CSS 构建内容String,它可以采用从主题中提取的文本颜色.

Ren*_*ard 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);
    }
Run Code Online (Sandbox Code Playgroud)

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

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

现在我们有了文本颜色,接下来就是将该值注入到您的 Web 视图中。我使用以下设备测试了此代码

运行 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)

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

干杯雷纳德