Кнопки диалогового окна "Тематические предупреждения" MaterialComponents

Недавно я переключился с библиотеки поддержки на com.google.android.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 имеют цветной фон, и теперь кнопки выглядят так: enter image description here

Как я могу сделать их снова без границ и без фона?

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

android.app.AlertDialog.Builder

Ответы

Ответ 1

Я понял, что является причиной этой проблемы. Мне нужно использовать другой класс AlertDialog:

androidx.appcompat.app.AlertDialog

Когда я перешел на это все стало работать как положено. Вот где я нашел решение:

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

Ответ 2

При использовании 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>

Screenshot

Ответ 3

Если вы используете библиотеку компонентов материалов, лучший способ получить AlertDialog - это использовать MaterialAlertDialogBuilder.

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

Это результат по умолчанию:

enter image description here

Ответ 4

Нашел другое решение для этого с использованием 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

Если вы используете библиотеку com.android.support:design:28.0.0, использование android.support.v7.app.AlertDialog работает должным образом.

Ответ 6

Если вы не хотите использовать 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"/>

Ответ 7

Чтобы использовать-получить стили Material, добавьте атрибут style к Button затем, для вашей цели:

style="@style/Widget.MaterialComponents.Button.TextButton"

Покажет:

enter image description here

Другие стили доступны в моем ответе, вы можете взглянуть: fooobar.com/info/35144/...

Кроме того, прочтите следующее: https://material.io/develop/android/components/material-button/