Стиль кнопок в AlertDialogs - PullRequest
20 голосов
/ 26 марта 2010

Кто-нибудь знает, как переопределить стиль по умолчанию для кнопок AlertDialog? Я просмотрел исходный код Android для тем и стилей и экспериментировал с разными вещами, но мне не удалось найти способ, который работает.

То, что у меня есть ниже, работает для изменения фона, но ничего не делает с кнопками. myTheme применяется ко всему <application> через манифест. (Некоторые другие элементы были удалены для ясности, но они относятся только к строке заголовка.)

<style name="myTheme" parent="android:Theme">
    <item name="android:buttonStyle">@style/customButtonStyle</item>
    <item name="android:alertDialogStyle">@style/dialogAlertTheme</item>
</style>

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert">
    <item name="android:fullDark">@drawable/dialog_loading_background</item>
    <item name="android:topDark">@drawable/dialog_alert_top</item>
    <item name="android:centerDark">@drawable/dialog_alert_center</item>
    <item name="android:bottomDark">@drawable/dialog_alert_bottom</item>
    <!-- this last line makes no difference to the buttons -->
    <item name="android:buttonStyle">@style/customButtonStyle</item> 
</style>

Есть идеи?

Ответы [ 6 ]

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

Учитывая, что рассуждения мистера Сноуфлэйка неточны, я позволю себе дать другой ответ.

Есть что-то неправильно с разметкой в вопросе Стива Хейли, и это смешивает alertDialogStyle и alertDialogTheme, скорее всего из-за того, что alertDialogTheme был введен задолго после того, как alertDialogStyle был вокруг.

Таким образом, даже если @android: style / Theme.Dialog.Alert доступен на вашей платформе Andoid, вы все равно не сможете использовать его выразительную мощь, подключив верную версию в свою собственную тему, если ваша платформа Android не поддерживает android: alertDialogTheme атрибут / элемент для тем. (Может быть, а может и нет, что такие несовместимые версии Android существуют, я точно не знаю. Но разметка, использованная в вопросе, предполагает, что это так.)

В разметке вопроса parent = "@ android: style / Theme.Dialog.Alert" ничего не будет делать , кроме создания иллюзии, что вы настраиваете тему диалога оповещения, когда вы действительно только настраивая стиль диалога предупреждения.

Вот так должна выглядеть разметка; не все версии Android поддерживают все функции.

<style name="myTheme" parent="android:Theme">
    <item name="android:buttonStyle">@style/customButtonStyle</item>
    <item name="android:alertDialogStyle">@style/dialogAlertStyle</item>
    <item name="android:alertDialogTheme">@style/dialogAlertTheme</item>
</style>

<style name="dialogAlertStyle" parent="@android:style/AlertDialog">
    <item name="android:fullDark">[...]</item>
    [...]
</style>

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert">
    <item name="android:windowBackground">[...]</item>
    [...]
</style>

Настройка стиля диалога предупреждений существует довольно давно, но ограничивается предоставлением (фонового) рисования для «fullDark», «topDark» и т. Д.

Настройка темы диалогового окна оповещения открывает метод для предоставления таких атрибутов, как windowBackground, windowTitleStyle и т. П., Но, как указано выше, вам нужна версия Android, которая поддерживает атрибут / элемент alertDialogThem для тем. Я не могу точно понять, когда это было введено, но это не был Android 2.2, и Eclipse все равно скажет вам ...

У меня нет ресурсов для проверки вывода MrSnowflake о том, что невозможно стилизовать диалоговые кнопки предупреждений в XML, но если мы не столкнулись с одним из тех неприятных аспектов Android, где функция действительно отсутствует, я нахожу это маловероятным .

На самом деле, то, что отсутствует в вопросе, является наиболее важной частью в этом отношении, а именно

<style name="customButtonStyle" />

поэтому вывод о том, что кнопки оповещения не подчиняются Widget.Button, с моей точки зрения, еще не доказан.

Сводный вывод: В Android ограничены возможности стилизовать диалоги оповещений независимо от других виджетов, но они становятся все более мощными по мере улучшения новых версий в этом отношении.

10 голосов
/ 26 июля 2016

Попробуйте это:

 <item name="buttonBarStyle">@style/Widget.AppCompat.ButtonBar</item>
    <item name="buttonBarButtonStyle">@style/AppTheme.Button</item>
    <item name="buttonBarPositiveButtonStyle">@style/YoursTheme</item>
    <item name="buttonBarNegativeButtonStyle">@style/YoursTheme</item>
    <item name="buttonBarNeutralButtonStyle">@style/YoursTheme</item>
3 голосов
/ 24 июля 2014

Вы можете переопределить «buttonBarButtonStyle» вместо «buttonStyle» следующим образом:

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert">
  <item name="android:buttonBarButtonStyle">@style/customButtonStyle</item>
</style>
2 голосов
/ 11 декабря 2018

Если вы используете материальные компоненты:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:alertDialogTheme">@style/AlertDialogTheme.Light</item>
</style>

<style name="AlertDialogTheme.Light" parent="ThemeOverlay.MaterialComponents.Dialog.Alert" >
    <item name="android:buttonBarButtonStyle">@style/InsertCustomButtonStyleHere</item>
</style>

Это сохранит цвета вашей темы, но заменит стиль кнопок, например, для соответствия Widget.MaterialComponents.Button.TextButton.

2 голосов
/ 24 марта 2015

Я сделал такой метод, который изменит цвета кнопок по умолчанию и фон

public static void setDefaultColorTextForDialogButton(AlertDialog alertDialog, Resources r) {
    Button b;

    b= alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
    if(b != null) {
        b.setTextColor(r.getColor(R.color.default_text));
        b.setBackgroundColor(Color.WHITE);
    }
    b = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
    if(b != null) {
        b.setTextColor(r.getColor(R.color.default_text));
        b.setBackgroundColor(Color.WHITE);
    }
    b = alertDialog.getButton(DialogInterface.BUTTON_NEUTRAL);
    if(b != null) {
        b.setTextColor(r.getColor(R.color.default_text));
        b.setBackgroundColor(Color.WHITE);
    }
}

Это может быть полезно для некоторых людей !!!

0 голосов
/ 26 марта 2010

См. Все остальные ответы ниже.

Неправильно:

Полагаю, вам нужно реализовать собственный класс Dialog.

...