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

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

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

4b9b3361

Ответ 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.

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