Кнопки диалогового окна "Тематические предупреждения" 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 имеют цветной фон, и теперь кнопки выглядят так:
Как я могу сделать их снова без границ и без фона?
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>
Ответ 3
Если вы используете библиотеку компонентов материалов, лучший способ получить AlertDialog
- это использовать MaterialAlertDialogBuilder
.
new MaterialAlertDialogBuilder(context)
.setTitle("Dialog")
.setMessage("Lorem ipsum dolor ....")
.setPositiveButton("Ok", /* listener = */ null)
.setNegativeButton("Cancel", /* listener = */ null)
.show();
Это результат по умолчанию:
Ответ 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"
Покажет:
Другие стили доступны в моем ответе, вы можете взглянуть: fooobar.com/info/35144/...
Кроме того, прочтите следующее: https://material.io/develop/android/components/material-button/