Тема 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]()
Ответы
Ответ 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);
}