首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebView如何从当前的安卓主题继承颜色?

WebView如何从当前的安卓主题继承颜色?
EN

Stack Overflow用户
提问于 2012-02-01 00:07:14
回答 1查看 4.2K关注 0票数 10

这个问题最初是在上周的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,这可以采取的文本颜色提取的主题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-25 21:20:42

我认为,为了找到解决方案,我们必须能够确定您的对话框在运行时使用的主题。我假设您没有设置主题说明。这意味着将使用默认的对话框主题。下面的代码来自Dialog类,它展示了如果没有明确设置主题,默认主题实际上如何应用于对话框。

代码语言:javascript
复制
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);
    }

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

代码语言:javascript
复制
    TypedValue tv = new TypedValue();
    dialog.getContext().getTheme().resolveAttribute(android.R.attr.textColorPrimary, tv, true);
    int textColor = getResources().getColor(tv.resourceId);

现在我们有了文本颜色,这是一个将该值注入到您的we视图中的问题。我用以下设备测试了这段代码

三星GalaxyTab10.1运行蜂窝

  • Theme.Holo.Light给文本颜色纯black
  • Theme.Holo给文本颜色纯白

HTC感觉运行姜饼

background

  • Theme.Black
  • Theme.Light给出了纯白色的文本颜色(这是正确的,因为对话框中有一个黑色的

也给出了纯白的文本颜色)。

三星Galaxy S2运行姜饼

(ffc8c8c8)

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

ICS仿真程序

  • Theme.Holo.Light给出了纯black
  • Theme.Holo的文本颜色,给出了非常浅灰色(Fff3f3f3)的

因此,这种方法在所有被测试的设备上都很有效。

雷纳德干杯

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9088946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档