Intereting Posts

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

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

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

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