Діалогові кнопки попередження про тему MaterialComponents


83

Нещодавно я перейшов з бібліотеки підтримки на com.google.android.material: material: 1.0.0

Але зараз у мене проблема, на цих сторінках є примітка https://github.com/material-components/material-components-android/blob/master/docs/getting-started.md

Примітка: Використання теми "Компоненти матеріалу" дає змогу користувачеві надихати подання, який замінює компоненти за замовчуванням на відповідні матеріали. Наразі це лише замінює компоненти Button XML на MaterialButton.

І тема, яку я використовую

Theme.MaterialComponents.Light.NoActionBar

робить саме те, що сказано в цій примітці, він замінює кнопки AlertDialog на MaterialButtons, але проблема в тому, що за замовчуванням MaterialButtons мають кольоровий фон, і тепер кнопки виглядають так: введіть тут опис зображення

Як я можу зробити їх знову без полів та без фону?

PS Я використовую конструктор сповіщень для створення діалогових вікон попереджень:

android.app.AlertDialog.Builder

Ви можете використовувати тему Bridge , якщо ви хочете зміст теми AppCompat з деякими новими стилями Матеріал призначеного для користувача інтерфейсу, він може вирішити вашу проблему, зверніться моїм відповідь: stackoverflow.com/a/52401497/10271334
Jeel Vankhede

Відповіді:


114

Я зрозумів, що спричинило цю проблему. Мені потрібно використовувати інший клас AlertDialog:

androidx.appcompat.app.AlertDialog

Коли я перейшов на це, все почало працювати, як очікувалося. Ось де я знайшов рішення:

https://github.com/material-components/material-components-android/issues/162


2
Я переніс свій код на androidx, використовуючи опцію / функцію «Перенести на AndroidX» в Android Studio, але ця бібліотека не була оновлена ​​до AndroidX автоматично. Ця проблема для мене була вирішена, коли я оновив імпорт вручну, як підказує відповідь,
sushrut619

1
Ви мене рятуєте! Дякую!
Матеус

Не всі герої носять накидки!
Дейв О Грейді

Незадовго до півночі велике спасибі. Ти врятував мені годину сну.
Нантока

76

При використанні com.google.android.material:material:1.0.0і androidx.appcompat.app.AlertDialogви можете налаштувати кожну кнопку в buttonBar, використовуючи Widget.MaterialComponents.Button.TextButtonяк батьківський.

val builder: AlertDialog.Builder = AlertDialog.Builder(ContextThemeWrapper(context, R.style.AlertDialogTheme))

Використовуйте макет за замовчуванням або додайте власний до builder.setView(R.layout.my_dialog)

У ваших стилях:

<style name="AlertDialogTheme" parent="Theme.MaterialComponents.Light.Dialog.Alert">
    <item name="buttonBarPositiveButtonStyle">@style/Alert.Button.Positive</item>
    <item name="buttonBarNegativeButtonStyle">@style/Alert.Button.Neutral</item>
    <item name="buttonBarNeutralButtonStyle">@style/Alert.Button.Neutral</item>
</style>

<style name="Alert.Button.Positive" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="backgroundTint">@color/transparent</item>
    <item name="rippleColor">@color/colorAccent</item>
    <item name="android:textColor">@color/colorPrimary</item>
    <item name="android:textSize">14sp</item>
    <item name="android:textAllCaps">false</item>
</style>

<style name="Alert.Button.Neutral" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="backgroundTint">@color/transparent</item>
    <item name="rippleColor">@color/colorAccent</item>
    <item name="android:textColor">@color/gray_dark</item>
    <item name="android:textSize">14sp</item>
</style>

Знімок екрана


1
Це те, що я шукав, намагаючись стилізувати мої діалоги. Усі відповіді, які я знайшов, не використовували AndroidX.
Леонардо

2
Я просто не впевнений, чому ви налаштовуєте textAllCaps на false. Зазвичай я бачу, що для цього діалогового вікна встановлено значення true (єдиним винятком був приклад Material Design від google під назвою Crane)
LeonardoSibela

5
Я би хотів, щоб я проголосував за це 50 разів. Я провів близько двох годин, намагаючись просто розфарбувати дурні діалоги. Зауважте, що MaterialAlertDialogBuilderзамість цього слід також використовувати .
gMale

1
Коментар @gMale заощадив мені час.
funct7

1
Дякую, це справді допомогло!
Grisgram

21

Якщо ви використовуєте бібліотеку компонентів матеріалу, найкращий спосіб створити це AlertDialog- використовувати MaterialAlertDialogBuilder.

new MaterialAlertDialogBuilder(context)
            .setTitle("Dialog")
            .setMessage("Lorem ipsum dolor ....")
            .setPositiveButton("Ok", /* listener = */ null)
            .setNegativeButton("Cancel", /* listener = */ null)
            .show();

Це результат за замовчуванням:

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

Якщо ви хочете також застосувати інший стиль або колір до кнопок, ви можете перевірити цю відповідь .


Заміна AlertDialog.Builderна MaterialAlertDialogBuilderне змінила колір кнопок. Дивіться відповіді нижче, щоб змінити theme.
CoolMind

@CoolMind Питання не в тому, як змінити колір кнопки.
Габріеле Маріотті

13

Я перевірив наведені вище відповіді. Хоча я мав гарну ідею, жодна не працювала для моєї справи. Отже, це моя відповідь.

  1. Переконайтеся, що android:theme="@style/AppMaterialTheme"у вашому файлі маніфесту є розділ Програма або Діяльність.

  2. Відкрийте файл Styles.xml і змініть його, виходячи з наведеного нижче.

    <style name="AppMaterialTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
        <item name="colorPrimary">@color/primaryBlue</item>
        <item name="colorPrimaryDark">@color/primaryBlue</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="colorControlActivated">@color/primaryBlue</item>
        <item name="colorControlHighlight">@color/colorAccent_main</item>
        <item name="colorButtonNormal">@color/white</item>
    
        <item name="materialAlertDialogTheme">@style/AlertDialogMaterialTheme</item>
    </style>
    
    <style name="AlertDialogMaterialTheme" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog">
        <item name="buttonBarPositiveButtonStyle">@style/Alert.Button.Positive</item>
        <item name="buttonBarNegativeButtonStyle">@style/Alert.Button.Negative</item>
    </style>
    
    <style name="Alert.Button.Positive" parent="Widget.MaterialComponents.Button.UnelevatedButton">
        <item name="android:fillColor">@color/color_0054BB</item>
        <item name="android:textColor">@color/white</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:textSize">14sp</item>
        <item name="rippleColor">@color/colorAccent_main</item>
    </style>
    
    <style name="Alert.Button.Negative" parent="Widget.MaterialComponents.Button.OutlinedButton">
        <item name="strokeColor">@color/color_0054BB</item>
        <item name="android:textColor">@color/color_0054BB</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:textSize">14sp</item>
        <item name="android:layout_marginEnd">8dp</item>
        <item name="rippleColor">@color/colorAccent_main</item>
    </style>
    

  3. Вам не потрібно буде застосовувати тему до свого AlertDialog, оскільки ваша активність застосовує тему до неї. Отже, створюйте діалогове вікно нормально.

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

Результат буде.

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


Я не знаю чому, за "buttonBarPositiveButtonStyle" не працює для мене, але "android: buttonBarPositiveButtonStyle" працює належним чином.
Лукаш Тарашка

Стиль не застосовується до PositiveButton. Те саме з негативним.
Лукаш Тарашка

11

По-перше, краще використовувати матеріал MaterialAlertDialog, якщо ви використовуєте тему матеріалів.

Детальніше ви можете прочитати тут - Material.io → Діалоги тематики

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

MaterialAlertDialogBuilder(context)
            .setTitle(R.string.confirm)
            .setMessage(R.string.logout)
            .setPositiveButton(R.string.logout_alert_positive) { _, _ -> activity?.logout() }
            .setNegativeButton(R.string.never_mind, null)
            .show()

 

Це layout.xml дій MaterialAlertDialog. Як бачите, є 3 кнопки, кожна з яких має свої власні стилі. Отже, ось як ви можете їх змінити.

Крок 1: Скажіть Android, що ви хочете змінити тему MaterialAlertDialog за замовчуванням .

<style name="Base.AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    ...
    <item name="materialAlertDialogTheme">@style/AlertDialog</item>
    ...
</style>

Крок 2: Скажіть Android, що ви хочете змінити певний стиль кнопок. buttonBarNeutralButtonStyle, buttonBarNegativeButtonStyleабоbuttonBarPositiveButtonStyle

<style name="AlertDialog" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog">
    <item name="buttonBarNegativeButtonStyle">@style/NegativeButtonStyle</item>
</style>

Крок 3: Визначте власний стиль

<style name="NegativeButtonStyle" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="android:textColor">#FF0000</item>
</style>

6

Знайшов інше рішення для цього за допомогою MaterialComponents тут: https://issuetracker.google.com/issues/116861837#comment9

<style name="Theme.Custom.Material.Alert.Dialog.Light" parent="Theme.MaterialComponents.Light.Dialog.Alert">
    <item name="materialButtonStyle">@style/Widget.AppCompat.Button.Borderless</item>
</style>

<style name="Theme.Custom.Material.Base.Light" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="android:dialogTheme">@style/Theme.Custom.Material.Alert.Dialog.Light</item>
    <item name="android:alertDialogTheme">@style/Theme.Custom.Material.Alert.Dialog.Light</item>
  ....
</style>

Хоча це все ще не "передбачувана поведінка" для мене.


5

Якщо ви не хочете використовувати androidx.appcompat.app.AlertDialog , ви можете просто перевизначити стиль кнопок діалогового вікна:

У вашому style.xml:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
   ...
   <item name="android:buttonBarButtonStyle">@style/DialogButton</item>
   ...
</style>

<style name="DialogButton" parent="Widget.MaterialComponents.Button.TextButton"/>


4

Якщо ви користуєтесь com.android.support:design:28.0.0бібліотекою, використовуйте android.support.v7.app.AlertDialogроботи, як очікувалося.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.