Как изменить фон диалоговых окон 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», похоже, не имеют никакого эффекта.

Итак, как я могу изменить фон этих диалоговых окон оповещений?

Solutions Collecting From Web of "Как изменить фон диалоговых окон Android alert?"

Ваш подход не будет работать. Кажется, что 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?).

Это легко сделать в стиле 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.

К сожалению, документация о том, какая функция была добавлена, когда она очень бедна. Пожалуйста, узнайте сами, какой подход подходит для вас.

Из документации видно, что вы можете сделать это в onCreateDialog.

 FrameLayout fl = (FrameLayout) findViewById(android.R.id.custom); fl.setBackgroundResource(); // has to be a drawable. 

Только другое решение – это настраиваемый диалог с использованием этой темы.