Как использовать и стилизовать новый AlertDialog из appCompat 22.1 и выше


154

Я пытаюсь перейти с Android AlertDialogпо умолчанию на новый, включенный в appCompat-22.1. Насколько я понимаю, вам нужно только импортировать android.support.v7.app.AlertDialogпакет, чтобы использовать его.

Но как мне это сделать? Например, изменить цвета кнопок «плюс» / «минус», цвет заголовка, цвет сообщения и цвет фона?

Ответы:


448

При создании AlertDialogвы можете установить тему для использования.

Пример - создание диалога

AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.MyAlertDialogStyle);
builder.setTitle("AppCompatDialog");
builder.setMessage("Lorem ipsum dolor...");
builder.setPositiveButton("OK", null);
builder.setNegativeButton("Cancel", null);
builder.show();

styles.xml - Пользовательский стиль

<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    <!-- Used for the buttons -->
    <item name="colorAccent">#FFC107</item>
    <!-- Used for the title and text -->
    <item name="android:textColorPrimary">#FFFFFF</item>
    <!-- Used for the background -->
    <item name="android:background">#4CAF50</item>
</style>

результат

в стиле алертилдиалог

редактировать

Чтобы изменить внешний вид заголовка, вы можете сделать следующее. Сначала добавьте новый стиль:

<style name="MyTitleTextStyle">
    <item name="android:textColor">#FFEB3B</item>
    <item name="android:textAppearance">@style/TextAppearance.AppCompat.Title</item>
</style>

впоследствии просто укажите этот стиль в вашем MyAlertDialogStyle:

<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    ...
    <item name="android:windowTitleStyle">@style/MyTitleTextStyle</item>
</style>

Таким образом, вы можете определить другое textColorдля сообщения через android:textColorPrimaryстиль и другое для заголовка через стиль.


2
Спасибо @reVerse Еще одна вещь. Многие библиотеки позволяют иметь разные цвета заголовка и текста. Вы знаете, возможно ли это и здесь?
ThanosFisherman

3
Привет снова! Есть ли способ изменить размер текста сообщения?
ThanosFisherman

1
@ThanosF К сожалению, я не знаю ни одного атрибута xml, который делает это. Но это, безусловно, возможно с помощью Java-кода.
вспомнить

2
@summers Jup. Это в основном идея appcompat-v7- она ​​возвращает обратную совместимость новых компонентов до уровня API 7 (Android 2.1)
reRerse

1
Чтобы цвет текста кнопок работал на 21+, мне нужно было иметь элемент android: buttonStyle для MyAlertDialogStyle и элемент android: textColor в пользовательском стиле кнопок.
Тим Аутин

61

Чтобы использовать тему для всего приложения, и не используйте второй параметр для стилизации вашего диалога

<style name="MyTheme" parent="Base.Theme.AppCompat.Light">
    <item name="alertDialogTheme">@style/dialog</item>
    <item name="colorAccent">@color/accent</item>
</style>

<style name="dialog" parent="Base.Theme.AppCompat.Light.Dialog.Alert">
    <item name="colorAccent">@color/accent</item>
</style>

В моем приложении с использованием цветового акцента в теме не отображаются кнопки alertDialog с темой colorAccent. Мне нужно добавить стиль диалога в тему.


Не работает на API 10 (Android 2.3), вероятно, только на API 11+.
Олив

2
Возможно на API 15+. Я начинаю новый проект только на API 15+, я думаю, что Android до 4 устарел в 2015 году.
neoteknic

@Oliv Это работает на API 10 с использованием зависимости com.android.support:design:23.2.1
прохожий

IDEA говорит, что API 21+ должен использовать colorAccent на Base.Theme.AppCompat.Light.Dialog.Alert с использованием 'com.android.support:design:22.2.1'
Фелипе Андраде,

@Felipe Andrade Alway - последняя версия SDK, она должна работать! У меня есть проект с min api 15 и дизайном цели 25: 22.x устарел, использую 25.1.x и более
neoteknic

19

Если вы хотите использовать новый android.support.v7.app.AlertDialog и иметь разные цвета для кнопок, а также иметь собственный макет, взгляните на мой https://gist.github.com/JoachimR/6bfbc175d5c8116d411e

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.custom_layout, null);

    initDialogUi(v);

    final AlertDialog d = new AlertDialog.Builder(activity, R.style.AppCompatAlertDialogStyle)
            .setTitle(getString(R.string.some_dialog_title))
            .setCancelable(true)
            .setPositiveButton(activity.getString(R.string.some_dialog_title_btn_positive),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            doSomething();
                            dismiss();
                        }
                    })
            .setNegativeButton(activity.getString(R.string.some_dialog_title_btn_negative),
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dismiss();
                        }
                    })
            .setView(v)
            .create();

    // change color of positive button         
    d.setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(DialogInterface dialog) {
            Button b = d.getButton(DialogInterface.BUTTON_POSITIVE);
            b.setTextColor(getResources().getColor(R.color.colorPrimary));
        }
    });

    return d;
}

введите описание изображения здесь


Замечательно! Спасибо
ThanosFisherman

Спасибо, это единственный способ, который сработал для меня, но можете ли вы сказать мне, как я могу получить цвет для флажка? В моем приложении есть диалог со списком переключателей, созданных с помощью Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener). Я не хочу заходить так далеко, чтобы разделить адаптеры на подклассы и настроить представление там.
Габор

тяжелая артиллерия - это то, что всегда работает! Я должен был использовать это, чтобы позаботиться о 2 кнопках повстанцев, которые всегда отказывались менять цвет акцента!
rupps

7

Следуйте @reVerse ответ , но в моем случае, я уже имел некоторое свойство в моем AppThemeLike

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    ...
    <item name="android:textColor">#111</item>
    <item name="android:textSize">13sp</item>
</style>

Так что мой диалог будет выглядеть
введите описание изображения здесь

Я решил это

1) Измените импорт с android.app.AlertDialogна android.support.v7.app.AlertDialog
2) Я переопределяю 2 свойства AppThemeс нулевым значением

<style name="MyAlertDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
    <!-- Used for the buttons -->
    <item name="colorAccent">#FFC107</item>
    <!-- Used for the title and text -->
    <item name="android:textColorPrimary">#FFFFFF</item>
    <!-- Used for the background -->
    <item name="android:background">#4CAF50</item>


    <item name="android:textColor">@null</item>
    <item name="android:textSize">@null</item>
</style>

,

AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.MyAlertDialogStyle);

Надеюсь, что это поможет другим людям

введите описание изображения здесь


Ах, спасибо! Я не использовал поддержку AlertDialog.
masterwok

1

Если вы похожи на меня, вы просто хотите изменить некоторые цвета в AppCompat, и единственный цвет, который вам нужно уникально изменить в диалоговом окне, это фон. Тогда все, что вам нужно сделать, это установить цвет для colorBackgroundFloating.

Вот моя основная тема, которая просто изменяет некоторые цвета без вложенных тем:

    <style name="AppTheme" parent="Theme.AppCompat">
        <item name="colorPrimary">@color/theme_colorPrimary</item>
        <item name="colorPrimaryDark">@color/theme_colorPrimaryDark</item>
        <item name="colorAccent">@color/theme_colorAccent</item>
        <item name="colorControlActivated">@color/theme_colorControlActivated</item>
        <item name="android:windowBackground">@color/theme_bg</item>
        <item name="colorBackgroundFloating">@color/theme_dialog_bg</item><!-- Dialog background color -->
        <item name="colorButtonNormal">@color/theme_colorPrimary</item>
        <item name="colorControlHighlight">@color/theme_colorAccent</item>
    </style>

-3
    <item name="editTextColor">@color/white</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:textColorHint">@color/gray</item>
    <item name="android:textColorPrimary">@color/gray</item>
    <item name="colorControlNormal">@color/gray</item>
    <item name="colorControlActivated">@color/white</item>
    <item name="colorControlHighlight">#30FFFFFF</item>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.