Як використовувати та стилювати новий 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>

Результат

стилізований alardialog

Редагувати

Для того, щоб змінити Зовнішній вигляд заголовка, ви можете зробити наступне. Спочатку додайте новий стиль:

<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-код.
reVerse

2
@summers Jup. В основному це ідея appcompat-v7- вона приводить назад сумісність нових компонентів до рівня API 7 (Android 2.1)
reVerse

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>

У моєму додатку, що використовує кольоровий наголос у темі, не відображаються кнопки alarDialog із темою 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 Завжди орієнтуйся на останню версію SDK, вона має працювати! У мене є проект з min api 15 та дизайном target 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 кнопки повстанців, які завжди відмовлялися змінювати колір акценту!
рвап

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.