Как изменить стиль всплывающего диалога ListPreference? - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь изменить стиль всплывающего диалога 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 на данный момент:

enter image description here

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

enter image description here


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

Ответы [ 3 ]

0 голосов
/ 09 июля 2018

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

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

с

<item name="alertDialogTheme">@style/AlertDialogStyle</item>
0 голосов
/ 12 июля 2018

Я думаю, что вы смешиваете вещи в своей разметке. 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

Изменить ссылку: https://github.com/Gericop/Android-Support-Preference-V7-Fix/commit/a6082cb0a508f5e0305a626c9a2a841e943ef8f6#diff-483bbb12192b1b74adadc9b4076b203b

0 голосов
/ 05 июля 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);
...
}
...