- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这个问题最初是为上周举行的 AndroidDev Office Hours Hangout 发布在 Google Moderator 上的。问题居然直播回答了,可以看看here如果你喜欢。我将它张贴在这里是因为他们似乎对此很感兴趣,在这里我有更多的空间来详细说明。
WebView
通常用于按照作者的 Intent 显示网页内容(如他们在视频群聊中所述)。但我使用 WebView
来显示,不完全是内容本身,而是格式化文本(主要是粗体、斜体、项目符号列表和文本对齐)。使用 WebView
(换句话说,使用 HTML/CSS 更容易)比使用一堆 TextView 并保持它们的完美格式要容易得多。
问题是我在 AlertDialog
上使用具有透明背景的特定 WebView
。 WebView
文本颜色来自加载的内容 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
运行 Gingerbread 的 HTC Sensation
运行 Gingerbread 的三星 Galaxy S2
ICS 模拟器
所以这个方法在所有测试设备上都运行良好。
干杯雷纳德
关于android - WebView 如何继承当前 Android 主题的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9088946/
我最近在/ drawable中添加了一些.gifs,以便可以将它们与按钮一起使用。这个工作正常(没有错误)。现在,当我重建/运行我的应用程序时,出现以下错误: Error: Gradle: Execu
Android 中有返回内部存储数据路径的方法吗? 我有 2 部 Android 智能手机(Samsung s2 和 s7 edge),我在其中安装了一个应用程序。我想使用位于这条路径中的 sqlit
这个问题在这里已经有了答案: What's the difference between "?android:" and "@android:" in an android layout xml f
我只想知道 android 开发手机、android 普通手机和 android root 手机之间的实际区别。 我们不能从实体店或除 android marketplace 以外的其他地方购买开发手
自Gradle更新以来,我正在努力使这个项目达到标准。这是一个团队项目,它使用的是android-apt插件。我已经进行了必要的语法更改(编译->实现和apt->注释处理器),但是编译器仍在告诉我存在
我是android和kotlin的新手,所以请原谅要解决的一个非常简单的问题! 我已经使用导航体系结构组件创建了一个基本应用程序,使用了底部的导航栏和三个导航选项。每个导航选项都指向一个专用片段,该片
我目前正在使用 Facebook official SDK for Android . 我现在正在使用高级示例应用程序,但我不知道如何让它获取应用程序墙/流/状态而不是登录的用户。 这可能吗?在那种情
我在下载文件时遇到问题, 我可以在模拟器中下载文件,但无法在手机上使用。我已经定义了上网和写入 SD 卡的权限。 我在服务器上有一个 doc 文件,如果用户单击下载。它下载文件。这在模拟器中工作正常但
这个问题在这里已经有了答案: What is the difference between gravity and layout_gravity in Android? (22 个答案) 关闭 9
任何人都可以告诉我什么是 android 缓存和应用程序缓存,因为当我们谈论缓存清理应用程序时,它的作用是,缓存清理概念是清理应用程序缓存还是像内存管理一样主存储、RAM、缓存是不同的并且据我所知,缓
假设应用程序 Foo 和 Eggs 在同一台 Android 设备上。任一应用程序都可以获取设备上所有应用程序的列表。一个应用程序是否有可能知道另一个应用程序是否已经运行以及运行了多长时间? 最佳答案
我有点困惑,我只看到了从 android 到 pc 或者从 android 到 pc 的例子。我需要制作一个从两部手机 (android) 连接的 android 应用程序进行视频聊天。我在想,我知道
用于使用 Android 以编程方式锁定屏幕。我从 Stackoverflow 之前关于此的问题中得到了一些好主意,并且我做得很好,但是当我运行该代码时,没有异常和错误。而且,屏幕没有锁定。请在这段代
文档说: android:layout_alignParentStart If true, makes the start edge of this view match the start edge
我不知道这两个属性和高度之间的区别。 以一个TextView为例,如果我将它的layout_width设置为wrap_content,并将它的width设置为50 dip,会发生什么情况? 最佳答案
这两个属性有什么关系?如果我有 android:noHistory="true",那么有 android:finishOnTaskLaunch="true" 有什么意义吗? 最佳答案 假设您的应用中有
我是新手,正在尝试理解以下 XML 代码: 查看 developer.android.com 上的文档,它说“starStyle”是 R.attr 中的常量, public static final
在下面的代码中,为什么当我设置时单选按钮的外观会发生变化 android:layout_width="fill_parent" 和 android:width="fill_parent" 我说的是
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
假设我有一个函数 fun myFunction(name:String, email:String){},当我调用这个函数时 myFunction('Ali', 'ali@test.com ') 如何
我是一名优秀的程序员,十分优秀!