9

У меня проблемы с AlertDialog. Кнопки не используют accentColor для установки цвета текста кнопки.Цвет текста кнопки AlertDialog с поддержкой библиотеки v24.2.1

Я использую новейшую библиотеку поддержки, v24.2.1. Я стилизация моих диалогов в моем styles.xml следующим образом:

<style name="Base.Theme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="android:alertDialogTheme">@style/Widget.DialogStyle</item> 
    <item name="alertDialogTheme">@style/Widget.DialogStyle</item> 
</style> 

и Widget.DialogStyle выглядит следующим образом:

<style name="Widget.DialogStyle" parent="@style/Theme.AppCompat.Light.Dialog.Alert"> 
    <item name="android:colorAccent" tools:targetApi="lollipop">@color/primaryColor</item> 
    <item name="colorAccent">@color/primaryColor</item> 
    <item name="android:textColorPrimary">@color/primaryText</item> 
    <item name="android:textColor">@color/primaryText</item> 
    <item name="android:background">@color/backgroundColor</item> 
    <item name="android:textAppearanceLarge">@color/primaryText</item> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:windowIsFloating">true</item> 
</style> 

На ниже 24 диалоговых кнопках приложения API: окрашены с colorAccent, но на API 24 это больше не поведение (текст черный, должен быть оранжевым). См. Следующие screenshot.

Есть ли кто-нибудь, кто знает, как вернуть accentColor на кнопки? Спасибо.

ответ

9

AlertDialog Для некоторых реализаций кнопок содержатся в ButtonBar и взять свой стиль от buttonBarButtonStyle. Поэтому вам нужно переопределить настройки, которые вы наследуете от родительской темы (Theme.AppCompat.Light.Dialog.Alert).

Добавить следующий пункт Widget.DialogStyle:

<item name="buttonBarButtonStyle">@style/MyButtonStyle</item> 

и добавить еще один стиль под названием MyButtonStyle так:

<style name="MyButtonStyle" parent="Widget.AppCompat.Button.Borderless"> 
    <!-- Set background drawable and text size of the buttons here 
    <item name="android:background">@color/my_dialog_dark</item>--> 
    <item name="android:textSize">18sp</item> 

    <!-- this is the button text color! --> 
    <item name="android:textColor">@color/primaryColor</item> 
</style> 

EDIT

Благодаря kirtan403 за указание на это: вы также может использовать другой родительский стиль для кнопок, если Widget.AppCompat.Button.Borderless не делает t соответствует вашим требованиям.

example by [email protected] с использованием Widget.AppCompat.Button.ButtonBar.AlertDialog в качестве родительского стиля для кнопок можно найти в выпуске AOSP 220699: colorAccent не применяется к кнопкам AlertDialog на Android N.

+0

@Christian Leicht Jørgensen - Работал для меня, как с автономным AlertDialog, так и с AlertDialog в DialogFragment. Теперь я действительно надеюсь, что это сработает и для вас. – 0X0nosugar

+0

Это сделало трюк. Спасибо за помощь! –

+0

Сделано ли это изменение документально? –

1

Убедитесь, что вы импортируете правильно AlertDialog:

import android.support.v7.app.AlertDialog 

попробовать также раздувания диалог с другим AlertDialog.Builder конструктору:

android.support.v7.app.AlertDialog.Builder#Builder(android.content.Context, int) 

, что означает, что второй параметр является стиль диалога:

mDialog = new AlertDialog.Builder(context, R.style.Widget.DialogStyle).create(); 

EDIT:
Разделяя код, который я использую, чтобы показать предупреждение Диалог:

public AlertDialog showSimpleDialog(Context context, String title, String message, String btnOk, DialogInterface.OnClickListener handler) { 
    if (mDialog != null && mDialog.isShowing()) { 
     mDialog.dismiss(); 
     mDialog = null; 
    } 
    mDialog = new AlertDialog.Builder(context, R.style.AppTheme_Dialog).create(); 
    mDialog.setTitle(title); 
    mDialog.setMessage(message); 
    mDialog.setButton(DialogInterface.BUTTON_POSITIVE, btnOk, handler); 
    mDialog.setCanceledOnTouchOutside(false); 
    mDialog.show(); 
    return mDialog; 
} 

и стиль:

<style name="AppTheme.Dialog" parent="Theme.AppCompat.Light.Dialog.Alert"> 
    <item name="colorAccent">@color/colorPrimary</item> //blue 
    <item name="android:textColorPrimary">@color/primary_text_material_light</item> //black 
    <item name="android:windowMinWidthMajor">97%</item> 
    <item name="android:windowMinWidthMinor">97%</item> 
</style> 

и кнопки синего цвета. Проверено на эмулятор API 24.

+0

Я только что проверил с помощью эмуляторов: одно из моих приложений, а также код OP. Оба используют основной цвет текста для цвета текста кнопки при работе в Nougat. Это может быть еще одна ошибка Nougat :(Вчера кто-то опубликовал проблему с анимацией, сегодня это ... – 0X0nosugar

+0

Поэтому я советую вам использовать библиотеку поддержки для таких вещей, которые не зависят от стилей системной версии. –

+0

Спасибо, но это именно то, что я я делаю :) Вы проверили свой ответ на Нуге? Я действительно думаю, что это ошибка. Не-AppCompat AlertDialog: никаких проблем. DialogFragment: нет проблем. AppCompat AlertDialog: цвет текста на кнопке - textColorPrimary (из стиля диалога). Было бы неплохо, если бы вы могли запустить свой собственный тест с помощью кода, который вы опубликовали, и OP style.xml и сообщить нам, можете ли вы подтвердить эту проблему или нет. – 0X0nosugar

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

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