Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android对话框主题使图标太轻_Android_Icons_Themes_Android Alertdialog - Fatal编程技术网

Android对话框主题使图标太轻

Android对话框主题使图标太轻,android,icons,themes,android-alertdialog,Android,Icons,Themes,Android Alertdialog,我在Eclipse中创建了一个新的应用程序,目标是Jelly Bean。这是所有自动创建的代码。清单将应用程序主题设置为AppName: <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > . . . 生成的

我在Eclipse中创建了一个新的应用程序,目标是Jelly Bean。这是所有自动创建的代码。清单将应用程序主题设置为AppName:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    . . . 
生成的对话框是:

为什么ic_对话框_图标这么轻?它几乎看不见。我使用的是所有默认设置,我没有修改主题或任何颜色,系统不应该选择一个与其背景对比度更大的图标吗?我怎样才能修好它

使用修复进行编辑
根据Tomik信息,我阅读了android.R.attr.alertDialogIcon的文档,并进行了此修复(将setIcon()替换为setIconAttribute()

现在,对话框如下所示:


问题在于您使用的是私有资源
android.R.drawable.ic\u对话框\u alert

使用私有资源是有问题的,它们可能在不同的设备上有所不同,您甚至无法确保它们在所有设备上都存在。最好是避免使用私人资源。如果您需要它们,您应该从Android源代码复制它们,并将它们放在项目的资源中

您的资源太白的确切原因是您正在使用用于标准(非全息)主题的资源(
android.R.drawable.ic_dialog_alert

但是对于运行安卓4.x(API级别14)的设备,您使用的是Holo主题(
Android:theme.Holo.Light.DarkActionBar
),它通常使用不同的资源

对于Holo主题,默认的警报图标是暗主题的android.R.id.ic\u dialog\u alert\u Holo\u dark,对于亮主题的android.R.id.ic\u dialog\u alert\u Holo\u 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源复制到项目的资源中,因为这是确保图标始终保持不变的唯一方法。

如果您在这些设备上也使用light主题,则基于for pre 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);
}
AlertDialog.Builder=。。。;
if(VERSION.SDK\u INT
在您的评论之后,我阅读了信息并修复了代码。我将很快更新问题以反映结果:顺便说一句,我并不担心图标看起来总是一样的,只是它们是可见的。信息对话框呢?是否有类似的
.setIconAttribute(android.R.attr.?)
来代替
.setIcon(android.R.drawable.ic\u dialog\u info)
    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();    
            }
        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() {
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();    
        }
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);
}