MaterialComponents主题警报对话框按钮


81

最近,我从支持库切换到com.google.android.material:material:1.0.0

但是现在我有一个问题,在此页面中有一条注释https://github.com/material-components/material-components-android/blob/master/docs/getting-started.md

注意:使用“材料组件”主题可以启用自定义视图充气器,该充气器将默认组件替换为其“材料”对应的组件。当前,这仅用MaterialButton替换Button XML组件。

我正在使用的主题

Theme.MaterialComponents.Light.NoActionBar

完全按照该注释中的说明进行操作,它将AlertDialog Buttons替换为MaterialButtons,但是问题是默认情况下MaterialButtons是彩色背景,现在这些按钮如下所示: 在此处输入图片说明

如何使它们再次变得无边界和无背景?

PS我正在使用警报生成器来创建警报对话框:

android.app.AlertDialog.Builder

如果希望AppCompat主题内容具有一些新的Material UI样式,则可以使用Bridge主题,它可以解决您的问题,请参考我的答案:stackoverflow.com/a/52401497/10271334
Jeel Vankhede

Answers:


111

我弄清楚是什么导致了这个问题。我需要使用其他AlertDialog类:

androidx.appcompat.app.AlertDialog

当我切换到这一点时,一切都按预期开始工作。这是我找到解决方案的地方:

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


2
我使用Android Studio的“迁移到AndroidX”选项/功能将代码迁移到了androidx,但是该库并未自动更新为AndroidX。当我按照答案提示手动更新导入时,对我来说这个问题已解决
sushrut619 '19

1
你救我!谢谢!
Mateus

不是所有的英雄穿着斗篷!
dave o grady

午夜前不久,非常感谢。你救了我一个小时的睡眠。
南托卡

75

使用时com.google.android.material:material:1.0.0androidx.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。
LeonardoSibela

2
我只是不确定为什么要将textAllCaps设置为false。我通常会在对话框上看到将其设置为true(唯一的例外是Google的Material Design示例,名为Crane)
LeonardoSibela,

5
我希望我可以投票50次。我花了大约两个小时来尝试为愚蠢的对话框着色。请注意,您也应该使用MaterialAlertDialogBuilder
gMale

1
@gMale的评论为我节省了时间。
funct7

1
谢谢,这真的有帮助!
格里斯格拉姆

19

如果您使用的是Material Components库,则最好的方法AlertDialog是使用MaterialAlertDialogBuilder

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

这是默认结果:

在此处输入图片说明

如果您还想对按钮应用其他样式或颜色,则可以检查此答案


替换AlertDialog.BuilderMaterialAlertDialogBuilder不会改变按钮的颜色。请参阅下面的答案来更改theme
CoolMind

@CoolMind问题不是如何更改按钮颜色。
加布里埃里奥·马里奥蒂

12

我测试了以上答案。尽管我有一个好主意,但没有一个适合我的情况。所以,这就是我的答案。

  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”对我来说正常。
LukaszTaraszka

该样式不适用于PositiveButton。负数也一样。
LukaszTaraszka

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()

 

是MaterialAlertDialog操作的layout.xml。如您所见,有3个按钮,每个按钮都有自己的样式。因此,这里是您可以更改它们的方法。

第1步:告诉Android您要更改默认的MaterialAlertDialog主题。

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

第2步:告诉Android您要更改特定的按钮样式。buttonBarNeutralButtonStylebuttonBarNegativeButtonStylebuttonBarPositiveButtonStyle

<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"/>


3

如果您使用的是com.android.support:design:28.0.0库,android.support.v7.app.AlertDialog则按预期使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.