Как я могу изменить фон диалогов Android? - PullRequest
19 голосов
/ 25 июня 2010

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

Так как я могу изменить фон этих диалоговых окон предупреждений?

Ответы [ 3 ]

11 голосов
/ 25 июня 2010

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

4 голосов
/ 07 декабря 2012

Это легко сделать в стиле XML, когда вы поймете, что AlertDialogs имеют несколько специальных атрибутов.

Однако было бы интересно узнать, на какую версию Android вы ссылаетесь (или на которую ориентируетесь). Theme.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 также имеют атрибуты android: progressLayout и android: horizontalProgressLayout для стиля AlertDialog.

Кроме того, в более новых версиях Android можно ссылаться на тему AlertDialog, используя alertDialogTheme вместо alertDialogStyle в пользовательской теме. AlertDDialogThemes поддерживают более знакомые и более мощные атрибуты, такие как windowBackground, windowTitleStyle и т. Д. Взгляните на styles.xml и themes.xml.

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

3 голосов
/ 25 июня 2010

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

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

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

...