2013-02-16 68 views
42

我在Eclipse中創建了一個新的應用程序,目標是Jelly Bean。這是所有自動創建的代碼。清單設置應用程序主題AppName的:Android對話主題使圖標太亮

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

而出現的對話框:

resulting dialog box

爲什麼ic_dialog_icon這麼輕?它幾乎看不見。我正在使用所有的默認設置,我沒有修改主題或任何顏色,系統不應該選擇與背景對比更強的圖標嗎?我該如何解決它?

編輯與修復
繼Tomik信息,我讀android.R.attr.alertDialogIcon文檔和(與setIconAttribute()取代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() { 
做出此修復程序

現在對話框如下所示:

enter image description here

回答

43

問題是您正在使用私人資源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();  
     } 

不過我建議從Android源的資源複製到項目的資源,因爲這是你可以肯定的是,圖標將總是一樣的唯一途徑。

+0

按照您的評論我讀的信息和修復代碼。我將很快更新問題以反映結果。 :::順便說一句,我並不擔心圖標看起來總是一樣的,只是它們是可見的。 – ilomambo 2013-02-16 14:10:35

+0

信息對話框怎麼樣? 是否有類似的 '.setIconAttribute(android.R.attr。????)' 到位 '.setIcon(android.R.drawable.ic_dialog_info)的使用' – JFar 2016-03-24 23:00:54

1

一個workround基於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); 
}