Подтвердить что ты не робот

Тема Android Dialog делает значок слишком светлым

Я создал новое приложение в 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();    
            }

И получившееся диалоговое окно:

resulting dialog box

Почему 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() {

Теперь диалог выглядит следующим образом:

enter image description here

4b9b3361

Ответ 1

Проблема в том, что вы используете частный ресурс android.R.drawable.ic_dialog_alert.

Использование частных ресурсов проблематично, они могут различаться на разных устройствах, и вы даже не можете быть уверены, что они присутствуют на всех устройствах. Лучше всего избегать использования частных ресурсов. Если вам это нужно, вы должны скопировать их из Android-источников и поместить их в свои ресурсы проекта.

Точная причина, по которой ваш ресурс слишком беден, заключается в том, что вы используете ресурс (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 в ресурсы проекта, потому что это единственный способ убедиться, что значок всегда будет выглядеть одинаково.

Ответ 2

Работа на основе Ответ Tomik для 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);
}