Как изменить фон диалоговых окон Android alert?
Я использую класс AlertDialog в своем приложении. По умолчанию эти диалоговые окна предупреждений имеют прозрачный фон. Вместо этого я пытаюсь использовать непрозрачный фон, очень неудачно. Это мои стили:
<style name="MyOpaqueActivity" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@drawable/my_background</item>
<item name="android:alertDialogStyle">@style/MyOpaqueAlertDialog</item>
</style>
<style name="MyOpaqueAlertDialog" parent="@android:style/Theme.Dialog.Alert">
<item name="android:background">#454545</item>
<item name="android:windowBackground">@drawable/my_background</item>
<item name="android:popupBackground">@drawable/my_background</item>
</style>
Я успешно применил стиль "MyOpaqueActivity" для всех видов деятельности (фон фона изменен на "my_background" ), но он не работает для диалогов предупреждений в рамках этих действий. Атрибут "alertDialogStyle" и мой стиль "MyOpaqueAlertDialog", похоже, не имеют никакого эффекта.
Итак, как я могу изменить фон этих диалоговых окон оповещений?
Ответы
Ответ 1
Ваш подход не будет работать. Кажется, что AlertDialog (и Builder) жестко задает тему и не чтит alertDialogStyle где угодно:
protected AlertDialog(Context context) {
this(context, com.android.internal.R.style.Theme_Dialog_Alert);
}
public Builder(Context context) {
this(context, com.android.internal.R.style.Theme_Dialog_Alert);
}
Они пришли к такому же выводу здесь.
Пользовательский диалоговый класс, полученный из AlertDialog, который вызывает защищенный конструктор AlertDialog (context, R.style.MyOpaqueAlertDialog), будет обходным путем.
В последнем источнике для Android появился новый публичный конструктор для AlertDialog.Builder, который принимает аргумент темы. К сожалению, он еще не выпущен (возможно, в Gingerbread?).
Ответ 2
Это легко сделать в стиле XML, как только вы увидите, что AlertDialogs имеют несколько специальных атрибутов.
Однако было бы интересно узнать, какую версию Android вы имеете в виду (или нацеливаете на нее). Насколько я знаю, тема .Dialog относительно новая. Новые версии Android также не используют AlertDialogs при любых обстоятельствах, когда их использовали более старые версии.
Это работает для меня в Android 2.2:
<style name="MyTheme" parent="@android:style/Theme">
<item name="android:alertDialogStyle">@style/MyOpaqueAlertDialog</item>
</style>
<style name="MyOpaqueAlertDialog">
<item name="android:fullDark">@drawable/[...]</item>
<item name="android:topDark">@drawable/[...]</item>
<item name="android:centerDark">@drawable/[...]</item>
<item name="android:bottomDark">@drawable/[...]</item>
<item name="android:fullBright">@drawable/[...]</item>
<item name="android:topBright">@drawable/[...]</item>
<item name="android:centerBright">@drawable/[...]</item>
<item name="android:bottomBright">@drawable/[...]</item>
<item name="android:bottomMedium">@drawable/[...]</item>
<item name="android:centerMedium">@drawable/[...]</item>
</style>
В новых версиях Android также есть андроид: progressLayout и android: horizontalProgressLayout для стиля AlertDialog.
Кроме того, в новых версиях Android можно ссылаться на тему AlertDialog, используя alertDialogTheme вместо alertDialogStyle в пользовательской теме. AlertDDialogThemes поддерживают более знакомые и более мощные атрибуты, такие как windowBackground, windowTitleStyle и т.д. Посмотрите на styles.xml и themes.xml.
К сожалению, документация о том, какая функция была добавлена, когда она очень бедна. Пожалуйста, узнайте сами, какой подход подходит для вас.
Ответ 3
Из документации похоже, что вы можете сделать это в onCreateDialog.
FrameLayout fl = (FrameLayout) findViewById(android.R.id.custom);
fl.setBackgroundResource(); // has to be a drawable.
Только другое решение - это настраиваемый диалог с использованием этой темы.