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

Стиль кнопки в AlertDialogs

Кто-нибудь знает, как переопределить стиль по умолчанию для кнопок 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>

Любые идеи?

4b9b3361

Ответ 1

Я предполагаю, что вы должны реализовать свой собственный класс Dialog.

Ответ 2

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

Есть что-то неправильное с разметкой в вопросе Стив Хейли, и оно смешивает 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, но становятся более мощными, так как новые версии улучшаются в этом отношении.

Ответ 3

Попробуйте следующее:

 <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>

Ответ 4

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

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert">
  <item name="android:buttonBarButtonStyle">@style/customButtonStyle</item>
</style>

Ответ 5

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

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);
    }
}

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

Ответ 6

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

<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.