Как изменить стиль всплывающего диалогового окна ListPreference?

Я пытаюсь изменить стиль всплывающего диалогового окна ListPreference, как я видел в этом ответе. Например, я хочу другой цвет фона для диалога.

До сих пор я пытался применить свой собственный стиль с помощью:

<item name="android:dialogTheme">@style/AlertDialogStyle</item>
<item name="android:alertDialogTheme">@style/AlertDialogStyle</item>
<item name="android:alertDialogStyle">@style/AlertDialogStyle</item>
<item name="android:dialogPreferenceStyle">@style/AlertDialogStyle</item>


<style name="AlertDialogStyle" parent="AlertDialog.AppCompat">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:textColor">@color/lightGrey</item>
    <item name="android:background">@color/cardBackground</item>
    <item name="android:popupBackground">@color/cardBackground</item>
    <item name="android:windowBackground">@color/cardBackground</item>
    <item name="android:itemBackground">@color/cardBackground</item>
</style>

Но мой стиль по-прежнему не применяется/цвет фона не изменился.

Вот как сейчас выглядит всплывающее окно моего ListPreference:

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

И это цветовая тема, которую я хочу заархивировать (в основном та же тема, которую я использую для других моих диалогов):

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


Чтобы быстро воспроизвести мою проблему -> мой проект находится на github


person IIIIIIIIIIIIIIIIIIIIII    schedule 26.06.2018    source источник
comment
Рассматривали ли вы просто использование пользовательского вида?   -  person Aiko West    schedule 05.07.2018
comment
Я думал об этом, но я не уверен, что это правильный способ «просто» изменить цвет фона и цвет текста?   -  person IIIIIIIIIIIIIIIIIIIIII    schedule 05.07.2018


Ответы (3)


Отвечая на мой собственный вопрос. В конце концов, это было так же просто, как заменить:

<item name="android:alertDialogTheme">@style/AlertDialogStyle</item>

с

<item name="alertDialogTheme">@style/AlertDialogStyle</item>
person IIIIIIIIIIIIIIIIIIIIII    schedule 09.07.2018
comment
и добавьте правильные элементы appcompat - person Elias Fazel; 04.01.2020
comment
Замена где? - person Richard Barraclough; 18.06.2020

Я думаю, вы смешиваете вещи в своей разметке. alertDialogStyle и alertDialogTheme отличаются друг от друга.

Настраивая тему диалогового окна предупреждения, вы должны создать свою тему диалогового окна, тему, которая, вероятно, должна расширять @android:style/Theme.Dialog.Alert

<item name="android:dialogTheme">@style/dialogAlertTheme</item>
<item name="android:alertDialogTheme">@style/dialogAlertTheme</item>
<item name="android:alertDialogStyle">@style/AlertDialogStyle</item>
<item name="android:dialogPreferenceStyle">@style/AlertDialogStyle</item>

<style name="dialogAlertTheme" parent="@android:style/Theme.Dialog.Alert">
    <item name="android:windowBackground">[...]</item>
    [...]
</style>

<style name="AlertDialogStyle" parent="AlertDialog.AppCompat">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:textColor">@color/lightGrey</item>
    <item name="android:background">@color/cardBackground</item>
    <item name="android:popupBackground">@color/cardBackground</item>
    <item name="android:windowBackground">@color/cardBackground</item>
    <item name="android:itemBackground">@color/cardBackground</item>
</style>

Примечание 1. Настройка стиля диалогового окна оповещения ограничена предоставлением (фоновых) рисунков.

Примечание 2. Настройка темы диалогового окна оповещения открывает метод для предоставления таких атрибутов, как windowBackground, windowTitleStyle и т. д., но вам нужна версия Android, которая поддерживает атрибут/элемент alertDialogThem для тем.

Объяснение вашего ответа: почему это работает, если вы удалите android: из android:alertDialogTheme

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

Теперь это стандартный способ переопределения стилей AlertDialog. Это было частью библиотеки, поскольку AlertDialog не использовал цвет акцента из основной темы, но был удален с тех пор, как в v24.2.0.0, так как команда Android исправила это поведение.

Ссылка на проблему: https://github.com/Gericop/Android-Support-Preference-V7-Fix/issues/52#issuecomment-255759293

Изменить ссылку:

person NullPointer    schedule 12.07.2018
comment
Если вы дополните свой ответ объяснением, почему использовать alertDialogTheme вместо android:alertDialogTheme, я вознагражу вас наградой. - person IIIIIIIIIIIIIIIIIIIIII; 12.07.2018
comment
спасибо за обновление, я знаю, что перепутал здесь кое-что. Но основная причина моей проблемы заключалась в том, что мне неясно, почему мне нужно было удалить android: из android:alertDialogTheme (как показано в моем ответе). Можете ли вы указать на какую-нибудь документацию, которая описывает это? - person IIIIIIIIIIIIIIIIIIIIII; 12.07.2018

В зависимости от того, сколько времени/места вы будете вызывать это, вы можете создать DialogFragment для обработки этого.

DialogFragment может быть таким простым:

public Dialog onCreateDialog(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mText = getArguments().getString("remark");
        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        //builder.setTitle("Remarks");
        builder.setMessage(mText);
        builder.setPositiveButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        return builder.create();
    }

это автоматически создаст простой диалог с кнопкой отмены. Чтобы добавить в стиле:, добавьте ниже после super.onCreate:

setStyle(DialogFragment.STYLE_NO_TITLE, R.style.AlertDialogStyle);

Или вы можете сделать что-то более индивидуальное, создав свой собственный макет: fragment_dialogfragment_alert.xml затем внутри класса, используя onCreateView вместо onCreateDialog

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_dialogfragment_alert, container, false);
...
}
person Jacky    schedule 05.07.2018
comment
1) поэтому вы предлагаете создать собственный ListPreference, в котором я переопределяю onCreateDialog, чтобы установить свой DialogStyle? - person IIIIIIIIIIIIIIIIIIIIII; 05.07.2018
comment
2) Вы пишете Depend on how many time/place will you call this. Можете ли вы описать, почему важно, сколько раз/мест я вызываю это? - person IIIIIIIIIIIIIIIIIIIIII; 05.07.2018
comment
@IIIIIIIIIIIIIIIIIIIIII 1) Я предпочитаю DialogFragment ListPreference, потому что ListPreference не обеспечивает достаточного количества настраиваемых изменений для моего диалога 2) поскольку он обеспечивает более гибкий диалог для изменений, вы можете повторно использовать диалог, передавая разные данные во фрагмент. Конечно, это не влияет, если вы используете только один - person Jacky; 05.07.2018
comment
но я не могу использовать DialogFragment внутри PreferenceScreen правильно? Поэтому я не вижу, как ваше решение мне помогает:/ - person IIIIIIIIIIIIIIIIIIIIII; 05.07.2018