Как узнать, какие темы используются для AlertDialog?

#android #android-alertdialog

#Android #android-alertdialog

Вопрос:

Я использую «Тему.МатериалКомпоненты.Свет» в моем приложении. И когда мне нужен пользовательский стиль какого-либо глобального элемента (кнопка, кнопка с плавающим действием, просмотр карты и т. Д.), Я открываю режим проектирования нужного элемента в макете и вижу, какая тема используется для конкретного элемента, затем я перехожу к теме.МатериалКомпоненты.Свет, найдите тему, добавьте ее в мою собственную тему (которая переопределяет тему.МатериалКомпоненты.Light), создайте мою собственную тему на основе этого и переопределите ее в теме приложения. Как сделать это глобально для AlertDialog? Я знаю, что если я создам ее, я смогу указать тему при вызове AlertDialog.Конструктор. Но что, если какая-то сторонняя библиотека сгенерирует ее, и я не смогу изменить ее вызов? Как заставить все использовать одну пользовательскую тему, как я делаю это с представлениями? Я попытался найти тему, которая отвечает за это, но безуспешно. Я переписал это (я прикреплю это ниже), но это не работает.

 //Base application theme
<style name="AppTheme" parent="Theme.MaterialComponents.Light">
    //Are they responsible for AlertDialogs or I'm wrong?
    <item name="alertDialogTheme">@style/AlertDialog</item>
    <item name="materialAlertDialogTheme">@style/AlertDialog</item>
</style>

//My custom theme, which doesn't override global AlertDialogs
<style name="AlertDialog" parent="Theme.MaterialComponents.Light.Dialog.Alert">
    <!-- Base colors -->
    <item name="android:textColorPrimary">#EEEEEE</item>
    <item name="colorControlNormal">#FFF</item>
    <item name="colorControlActivated">#FF0000</item>
    <item name="textColorAlertDialogListItem">#FFF</item>

    <!-- Button styles -->
    <item name="buttonBarPositiveButtonStyle">@style/YDialogPositiveButton</item>
    <item name="buttonBarNegativeButtonStyle">@style/YDialogNegativeButton</item>
    <item name="buttonBarNeutralButtonStyle">@style/YDialogNeutralButton</item>

    <!-- Sizes -->
    <item name="android:lineSpacingExtra">2dp</item>
    <item name="android:textSize">20sp</item>
    <item name="android:windowTitleStyle">@style/YDialogTitleTextAppearance</item>
</style>
 

Комментарии:

1. Под не работает, вы имеете в виду, что ни в одном из ваших диалоговых окон ничего не происходит, или проблема только в сторонних диалоговых окнах? Возможно, библиотека, которую вы используете, не использует тему MaterialComponents.

2. @Tenfour04 Ничего не происходит даже в моих собственных AlertDialogs. И говоря «сторонняя библиотека», я имею в виду эту (средство выбора цвета AmbilWarna) github.com/yukuku/ambilwarna . Я просмотрел исходный код, и в нем не указана какая-либо тема. И я узнал одну вещь: когда я меняю атрибут «primaryColor» в моей базовой теме приложения, он применяется к кнопкам в каждом AlertDialog (включая диалоговое окно выбора цвета третьей части). На самом деле. это именно то, что я хочу изменить (цвет текста кнопок), потому что мне нужен «primaryColor» для других целей.

3. materialAlertDialog используется только с классом materialertdialog, а не с AlertDialog. Я не уверен, почему alertDialogTheme это не применяется. Кстати, вы можете захотеть, чтобы он использовал a ThemeOverlay в качестве родительского элемента, поэтому он будет использовать все атрибуты темы верхнего уровня, которые вы установили, и не хотите избыточно устанавливать в теме диалога.

4. @Tenfour04 на самом деле я не применяю пользовательский стиль в своих собственных alertdialogs. Есть много вложенных стилей, которые я не заметил. Но мне любопытно, почему это не относится к диалоговому окну выбора цвета.

5. Я вижу проблему. Вы, вероятно, используете androidx.appcompat.app.AlertDialog для своих собственных диалогов, в то время как библиотека использует фреймворк android.app.AlertDialog , поэтому они разрешают разные темы для диалога. Использует appcompat AlertDialog alertDialogTheme и использует фреймворк AlertDialog android:alertDialogTheme . Может быть сложно создать тему, которая работает с обоими, поскольку AppCompat переопределяет кучу вещей. Возможно, вы захотите поискать другую библиотеку выбора цвета, которая использует AppCompat или, по крайней мере, позволяет передавать ресурс стиля его конструктору.