2010-03-26 3 views
14

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

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

Любые идеи?

ответ

2

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

+4

Хм. Это будет раздражать; изменение кнопок «Диалог» не должно быть необычным, если учесть, что для кнопок «нормальная» активность легко применить стиль кнопки. –

+0

В обычных действиях вы определяете расположение представления содержимого с помощью xml. Диалог делает это для вас, поэтому у вас нет доступа к макету xml. Внедрение собственного диалога (возможно, только с вызовом setContentView()) позволяет вам использовать разные xml и, следовательно, разные стили для кнопок. – MrSnowflake

+1

Как бы вы подклассировали AlertDialog, чтобы вы могли использовать AlertDialog.Builder с вашим подклассом? –

23

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

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

1

Вы можете переопределить «buttonBarButtonStyle» вместо «ButtonStyle», как это:

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

требует API 11 или выше – Yar

+0

, как если бы кто-нибудь еще развивался для api 10 и ниже .. –

+1

@TimCastelijns Я чувствую, что это не так. Качественный ответ должен предоставить эту информацию. И на самом деле есть случаи, когда люди должны поддерживать обратные совместимые приложения. –

1

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

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

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

+1

В языке OO, таком как Java, это действительно не самый предпочтительный способ делать вещи, особенно учитывая ремонтопригодность. –

4

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

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

Это было бы более полезно, если бы вы объяснили, где эти строки должны быть размещены. Я точно не понимаю ... – RenniePet

+0

Спасибо за это, искал его часами! @RenniePet вы должны поместить его в свою тему диалога, тему, которая, вероятно, должна расширять 'ThemeOverlay.AppCompat.Dialog.Alert' и что вы объявляете в своей теме, используя @ style/YourDialogTheme Benoit

 Смежные вопросы

  • Нет связанных вопросов^_^