我在Eclipse中创建了一个新的应用程序,目标是Jelly Bean。这是所有自动创建的代码。清单将应用程序主题设置为AppName:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
. . .
,它转换为AppBaseTheme,用于值dir中的样式:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<!--
Base application theme, dependent on API level. This theme is replaced
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Light">
<!--
Theme customizations available in newer API levels can go in
res/values-vXX/styles.xml, while customizations related to
backward-compatibility can go here.
-->
</style>
<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
</style>
</resources>
值-v14 / styles.xml是:
<resources>
<!--
Base application theme for API 14+. This theme completely replaces
AppBaseTheme from BOTH res/values/styles.xml and
res/values-v11/styles.xml on API 14+ devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<!-- API 14 theme customizations can go here. -->
</style>
</resources>
然后我在退出之前创建了一个确认对话框:
case R.id.menu_quit:
new AlertDialog.Builder(this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle(R.string.confirm_title)
.setMessage(R.string.confirm_text)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
结果对话框为:
为什么ic_dialog_icon如此之亮?几乎看不到。我使用所有默认值,我没有修改主题或任何颜色,系统不应该选择一个与其背景形成鲜明对比的图标吗?我该如何解决?
使用修补程序进行修改
关注Tomik信息后,我阅读了 android.R.attr.alertDialogIcon 的文档并进行了此修复(将 setIcon()替换为 setIconAttribute())
new AlertDialog.Builder(this)
.setIconAttribute(android.R.attr.alertDialogIcon)
.setTitle(R.string.confirm_title)
.setMessage(R.string.confirm_text)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
现在对话框如下所示:
答案 0 :(得分:49)
问题是您使用的是私有资源android.R.drawable.ic_dialog_alert
。
使用私有资源是有问题的,它们可能因设备而异,甚至无法确定它们是否存在于所有设备上。最好的办法是避免使用私人资源。如果您需要它们,您应该从Android源代码中复制它们并将它们放入项目的资源中。
资源太白的确切原因是您使用的资源(android.R.drawable.ic_dialog_alert
)用于标准(非Holo)主题。
但对于运行Android 4.x(API级别14)的设备,您使用的是Holo主题(android:Theme.Holo.Light.DarkActionBar
),它通常使用不同的资源。
使用Holo主题时,黑暗主题的默认警报图标为android.R.id.ic_dialog_alert_holo_dark
,灯光主题为android.R.id.ic_dialog_alert_holo_light
(您需要使用此资源)。
注意:从API级别11开始,有一个属性android.R.attr.alertDialogIcon
,它引用当前主题的默认警报对话框图标。在您的代码中,您可以这样使用它:
case R.id.menu_quit:
new AlertDialog.Builder(this)
.setIconAttribute(android.R.attr.alertDialogIcon)
.setTitle(R.string.confirm_title)
.setMessage(R.string.confirm_text)
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
我仍然建议将资源从Android源复制到项目的资源,因为这是确保图标始终保持一致的唯一方式。
答案 1 :(得分:2)
如果您在这些设备上使用了轻量级主题,那么基于Tomik's answer的预制HC的工作区也是如此:
AlertDialog.Builder builder = ...;
if (VERSION.SDK_INT < VERSION_CODES.HONEYCOMB) {
Drawable icon = ContextCompat.getDrawable(context, android.R.drawable.ic_dialog_alert).mutate();
icon.setColorFilter(new ColorMatrixColorFilter(new float[] {
-1, 0, 0, 0, 255, // red = 255 - red
0, -1, 0, 0, 255, // green = 255 - green
0, 0, -1, 0, 255, // blue = 255 - blue
0, 0, 0, 1, 0 // alpha = alpha
}));
builder.setIcon(icon);
} else {
builder.setIconAttribute(android.R.attr.alertDialogIcon);
}