Ответ 1
Я предполагаю, что вы должны реализовать свой собственный класс Dialog
.
Кто-нибудь знает, как переопределить стиль по умолчанию для кнопок AlertDialog? Я просмотрел источник Android для themes и styles и экспериментировал с разными вещами, но я не смог найти способ, который работает.
То, что у меня есть, работает для изменения фона, но ничего не делает с кнопками. 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>
Любые идеи?
Я предполагаю, что вы должны реализовать свой собственный класс Dialog
.
Учитывая, что рассуждения г-на Снейнфлейка неточны, я беру на себя свободу, чтобы дать другой ответ.
Есть что-то неправильное с разметкой в вопросе Стив Хейли, и оно смешивает alertDialogStyle и alertDialogTheme, скорее всего, из-за того, что alertDialogTheme был введен позже alertDialogStyle был вокруг.
Итак, даже если @android: style/Theme.Dialog.Alert доступен на вашей платформе Andoid, вы по-прежнему не можете использовать его выразительную силу, подключив cusomized версию обратно в свою собственную тему, если ваша платформа Android не поддерживает android: alertDialogTheme атрибут/элемент для тем. (Может быть, может быть и не так, что такие противоречивые версии Android существуют, я не знаю точно, но разметка, используемая в вопросе, предполагает, что это так.)
В вопросительной разметке родительский = "@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, но становятся более мощными, так как новые версии улучшаются в этом отношении.
Попробуйте следующее:
<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>
Вы можете переопределить "buttonBarButtonStyle" вместо "buttonStyle" следующим образом:
<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert">
<item name="android:buttonBarButtonStyle">@style/customButtonStyle</item>
</style>
Я сделал такой способ, который изменит цвета и фон кнопки по умолчанию
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);
}
}
Это может быть полезно для некоторых людей.
Если вы используете материальные компоненты:
<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
.