Як я можу змінити колір тексту діалогового вікна за замовчуванням на Android 5


160

У моєму додатку багато діалогових діалогових повідомлень. Це макет за замовчуванням, але я додаю в діалогове вікно позитивні та негативні кнопки. Тож кнопки отримують стандартний колір тексту для Android 5 (зелений). Я намагався це змінити без успіху. Будь-яка ідея, як змінити цей колір тексту?

Мій спеціальний діалог:

public class MyCustomDialog extends AlertDialog.Builder {

    public MyCustomDialog(Context context,String title,String message) {
        super(context);

        LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
        View viewDialog = inflater.inflate(R.layout.dialog_simple, null, false);

        TextView titleTextView = (TextView)viewDialog.findViewById(R.id.title);
        titleTextView.setText(title);
        TextView messageTextView = (TextView)viewDialog.findViewById(R.id.message);
        messageTextView.setText(message);

        this.setCancelable(false);

        this.setView(viewDialog);

    } }

Створення діалогового вікна:

MyCustomDialog builder = new MyCustomDialog(getActivity(), "Try Again", errorMessage);
builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            ...
                        }
}).show();

Ця негативна кнопка - це діалогова кнопка за замовчуванням і приймає зелений колір за замовчуванням від Android 5 Lollipop.

Велике дякую

Спеціальне діалогове вікно із зеленою кнопкою


Майже повторювані питання / відповіді stackoverflow.com/a/29810469/2291, які, на мою думку, є більш застосовними в ці дні.
Джон Адамс

Відповіді:


191

Ви можете спробувати створити AlertDialogоб’єкт спочатку, а потім використовувати його для налаштування, щоб змінити колір кнопки, а потім показати. (Зверніть увагу, що на builderоб'єкті замість того, щоб викликати, show()ми закликаємо create()отримати AlertDialogоб'єкт:

//1. create a dialog object 'dialog'
MyCustomDialog builder = new MyCustomDialog(getActivity(), "Try Again", errorMessage); 
AlertDialog dialog = builder.setNegativeButton("OK", new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    ...
                }

            }).create();

//2. now setup to change color of the button
dialog.setOnShowListener( new OnShowListener() {
    @Override
    public void onShow(DialogInterface arg0) {
        dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(COLOR_I_WANT);
    }
});

dialog.show()

Причина, коли ви повинні це зробити, onShow()і не можете просто отримати цю кнопку після створення діалогового вікна, полягає в тому, що кнопка ще не була створена.

Я змінився, AlertDialog.BUTTON_POSITIVEщоб AlertDialog.BUTTON_NEGATIVEвідобразити зміну у вашому запитанні. Хоча дивно, що кнопка "ОК" була б негативною кнопкою. Зазвичай це позитивна кнопка.


Дякую за вашу відповідь, але я не маю цього методу в AlertDialog. Дивіться мій оновлений пост.
FOMDeveloper

5
Цей метод знаходиться в класі AlertDialog, а не в класі Builder. Тож замість виклику Builder.show () ви можете Builder.create (), який повертає клас AlertDialog. Потім ви налаштовуєте слухача, а потім викликаєте show () на об’єкті AlertDialog
trungdinhtrong

3
Але для цього повинен бути інший спосіб. Здається, це колір із теми, чи можемо ми змінити його через тему / стиль?
milosmns

Це прекрасно. Щойно спробував у Xamarin.Android, і він працює досконало. Велике спасибі.
perozzo

280

Ось природний спосіб зробити це за допомогою стилів:

Якщо ваше AppThemeпередається у спадщину Theme.MaterialComponents, то:

<style name="AlertDialogTheme" parent="ThemeOverlay.MaterialComponents.Dialog.Alert">
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
</style>

<style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">#f00</item>
</style>

<style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:textColor">#00f</item>
</style>

Якщо ваше AppThemeпередається у спадок від Theme.AppCompat:

<style name="AlertDialogTheme" parent="ThemeOverlay.AppCompat.Dialog.Alert">
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
</style>

<style name="NegativeButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
    <item name="android:textColor">#f00</item>
</style>

<style name="PositiveButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
    <item name="android:textColor">#00f</item>
</style>

Використовуйте своє AlertDialogThemeу своємуAppTheme

<item name="alertDialogTheme">@style/AlertDialogTheme</item>

або в конструкторі

androidx.appcompat.app.AlertDialog.Builder(context, R.style.AlertDialogTheme)

34
Мені довелося змінити buttonBarNegativeButtonStyle на android: buttonBarNegativeButtonStyle та buttonBarPositiveButtonStyle на android: buttonBarPositiveButtonStyle. Тоді він працював (API 21+).
Влад

23
Не забудьте використовувати android.support.v7.app.AlertDialog замість android.app.AlertDialog. Помилка
дурня

2
Мені довелося змінити батьківську систему AlertDialogTheme на "Base.Theme.AppCompat.Light.Dialog.Alert". І видаліть buttonBarNegativeButtonStyle & buttonBarPositiveButtonStyle. Також додайте в <item name = "colorAccent"> @ color / dashboard_red_color </item> у AlertDialogTheme. Ідеально працює.
зефір

3
Це не працює при використанні нового матеріалу бібліотеки , com.google.android.material:material:1.0.0-beta01і я використовую Theme.MaterialComponents.Light.Dialog.Alert
Sanjeev

2
@LX оновлена ​​відповідь, щоб включити тему компонентів матеріалу
Олександр

120

Колір кнопок та іншого тексту також можна змінювати за допомогою теми:

значення-21 / styles.xml

<style name="AppTheme" parent="...">
  ...
  <item name="android:timePickerDialogTheme">@style/AlertDialogCustom</item>
  <item name="android:datePickerDialogTheme">@style/AlertDialogCustom</item>
  <item name="android:alertDialogTheme">@style/AlertDialogCustom</item>
</style>

<style name="AlertDialogCustom" parent="android:Theme.Material.Light.Dialog.Alert">
  <item name="android:colorPrimary">#00397F</item>
  <item name="android:colorAccent">#0AAEEF</item>
</style>

Результат:

Діалог Вибір дати


1
На даний момент я не знаю способу змінити лише колір або колір кнопки. Колір акценту змінює їх обох.
пецепс

4
Мені сподобався такий підхід, але я відчуваю, що відповідь на сайті stackoverflow.com/a/29810469/2291 - дещо чіткіший спосіб зробити це.
Джон Адамс

12
Щоб це працювало в моєму проекті, мені довелося видалити android:частину з android:alertDialogThemeі з android:colorAccent.
заборона-геоінженерія

2
Наявність андроїда: префікса від значень залежить від того, куди ви ставите styles.xml, у значеннях або у значеннях-vXX
peceps

1
Щоб зробити цю роботу з AppCompat і простою папкою значень, просто дотримуйтесь змін, запропонованих @ ban-geoengineering
Felix

94

Найпростішим рішенням є:

dialog.show(); //Only after .show() was called
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(neededColor);
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(neededColor);

4
Ці поля не повинні посилатися на нестатичну змінну, вони повинні бути AlertDialog.BUTTON_NEGATIVEтощо.
Joe Maher

Це був найкращий і найпростіший спосіб зробити це. Зауважте, що я не використовував "create", а схопив діалогове вікно після show (). Як і діалог AlertDialog = builder.show ();
Стівен Маккормік

2
Хоча це рішення може працювати, логічно воно недосконале. Що відбувається тут - ви спочатку показуєте діалогове вікно, а потім змінюєте його зовнішній вигляд. Залежно від основної реалізації (яка могла бути змінена з часом) і продуктивності пристрою, ви теоретично могли б побачити "мерехтіння", де користувач побачить діалогове вікно, а потім швидко змінити зовнішній вигляд.
trungdinhtrong

31

Є два способи змінити колір діалогової кнопки.

Основний спосіб

Якщо ви просто хочете змінити діяльність, напишіть наступні два рядки після alertDialog.show();

alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.colorPrimary));
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.colorPrimaryDark));

Рекомендовано

Я рекомендую додати тему для AlertDialogв styles.xmlтак що вам не доведеться писати один і той же код знову і знову в кожній діяльності / діалоговому виклик. Ви можете просто створити стиль і застосувати цю тему до діалогового вікна. Отже, коли ви хочете змінити колір AlertDialog, просто змініть колір у styles.xml і всі діалогові вікна будуть оновлені у всій програмі.

<style name="AlertDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="colorAccent">@color/colorPrimary</item>
</style>

І застосувати тему в AlertDialog.Builder

AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AlertDialogTheme);

Ця відповідь є найбільш чистою, але все ще є правильною.
Big_Chair

11

Якщо ви хочете змінити колір тексту кнопок (позитивний, негативний, нейтральний), просто додайте у свій власний стиль діалогу:

<item name="colorAccent">@color/accent_color</item>

Отже, ваш стиль діалогу повинен виглядати так:

<style name="AlertDialog" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:textColor">@android:color/black</item>
    <item name="colorAccent">@color/topeka_accent</item>
</style>

6
<style name="AlertDialogCustom" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:colorPrimary">#00397F</item>
    <item name="android:textColorPrimary">#22397F</item>
    <item name="android:colorAccent">#00397F</item>
    <item name="colorPrimaryDark">#22397F</item>
</style>

Колір кнопок та іншого тексту також можна змінити за допомогою appcompat:


Theme.AppCompat.Light.Dialog.Alert чудово працює, щоб змінити колір кнопки на білий.
Лев К

6
  1. У тему / стиль програми додайте наступні рядки:

    <item name="android:buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
    <item name="android:buttonBarPositiveButtonStyle">@style/PositiveButtonStyle</item>
    <item name="android:buttonBarNeutralButtonStyle">@style/NeutralButtonStyle</item>
  2. Потім додайте наступні стилі:

    <style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
        <item name="android:textColor">@color/red</item>
    </style>
    
    <style name="PositiveButtonStyle" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
        <item name="android:textColor">@color/red</item>
    </style>
    
    <style name="NeutralButtonStyle" 
    parent="Widget.MaterialComponents.Button.TextButton.Dialog">
        <item name="android:textColor">#00f</item>
    </style>

Використання цього методу робить неможливим задавати тему в конструкторі AlertDialog.


4

Як бічна примітка:

Кольори кнопок (і весь стиль) також залежать від поточної теми, яка може бути досить різною, коли ви використовуєте будь-яку

android.app.AlertDialog.Builder builder = new AlertDialog.Builder()

або

android.support.v7.app.AlertDialog.Builder builder = new AlertDialog.Builder()

(Краще використовувати другий)


3

Ось як це зробити: Простий спосіб

// Initializing a new alert dialog
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.message);
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        doAction();
    }
});
builder.setNegativeButton(R.string.cancel, null);

// Create the alert dialog and change Buttons colour
AlertDialog dialog = builder.create();
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface arg0) {
        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(getResources().getColor(R.color.red));
        dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(getResources().getColor(R.color.blue));
        //dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(getResources().getColor(R.color.black));
    }
});
dialog.show();

1

для мене це було інакше, я використовував тему кнопки

<style name="ButtonLight_pink" parent="android:Widget.Button">
      <item name="android:background">@drawable/light_pink_btn_default_holo_light</item>
      <item name="android:minHeight">48dip</item>
      <item name="android:minWidth">64dip</item>
      <item name="android:textColor">@color/tab_background_light_pink</item>
    </style>

і тому

android: textColor

там був білий ... я не бачив жодного тексту кнопки (кнопки "Діалогове" в основному теж кнопки). там ми їдемо, змінили, виправили.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.