Android对话主题使图标太轻

我在Eclipse中创build了一个新的应用程序,目标是Jelly Bean。 这是所有自动创build的代码。 清单将应用程序主题设置为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> 

然后在退出之前创build一个确认对话框:

  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很亮? 它几乎不可见。 我正在使用所有的默认设置,我没有修改主题或任何颜色,系统不应该select一个与它的背景形成鲜明对比的图标吗? 我该如何解决?

编辑修复
遵循Tomik信息,我阅读了android.R.attr.alertDialogIcon的文档,并做了这个修复(用setIconAttribute()replace了setIcon()

  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() { 

现在对话框如下所示:

在这里输入图像说明

问题是你正在使用私人资源android.R.drawable.ic_dialog_alert

使用私人资源是有问题的,他们可以在不同的设备上有所不同,您甚至不能确定它们在所有设备上。 最好是避免使用私人资源。 如果你需要他们,你应该从Android来源复制他们,并把他们放在你的项目的资源。

您资源太白的确切原因是您正在使用用于标准(非Holo)主题的资源( android.R.drawable.ic_dialog_alert )。
但是对于运行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(); } 

不过我build议将Android资源中的资源复制到项目资源中,因为这是确保图标始终显示的唯一方法。

如果您在这些设备上使用轻量级主题,则基于Tomik针对pre-HC 的回答进行workround :

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