深色主题中的 TextButton 默认颜色

TextButton default color in dark theme

尝试更改我的 Android 应用程序中所有 TextButtons 的默认颜色 material。我看到我可以设置“materialButtonStyle”和“materialButtonOutlinedStyle”的样式。但是我没有看到文本按钮的属性,可能类似于“materialButtonTextStyle

<style name="AppTheme" parent="Theme.MaterialComponents">
  <item name="materialButtonStyle">@style/myButton</item>
  <item name="materialButtonOutlinedStyle">@style/myButtonOutlined</item>
</style>

示例按钮:

<Button
    android:id="@+id/my_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    style="@style/Widget.MaterialComponents.Button.TextButton"
    android:text="Text Button" />

是否可以全局更改所有 material 个文本按钮的样式?

编辑: 从主题按钮 material 文档中尝试了这个。

<style name="AppTheme" parent="Theme.MaterialComponents">
  <item name="borderlessButtonStyle">@style/Widget.App.Button.TextButton</item>
</style>

<style name="Widget.App.Button.TextButton" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="materialThemeOverlay">@style/ThemeOverlay.App.Button.TextButton</item>
</style>

<style name="ThemeOverlay.App.Button.TextButton" parent="">
    <item name="colorPrimary">@color/md_purple_600</item>
</style>

但是仍然没有为所有文本按钮设置文本颜色样式。

正如您在 textButtonColors, TextButton 中看到的那样,使用 MaterialTheme 的原色作为默认内容颜色。

@Composable
fun textButtonColors(
    backgroundColor: Color = Color.Transparent,
    contentColor: Color = MaterialTheme.colors.primary,
    disabledContentColor: Color = MaterialTheme.colors.onSurface
        .copy(alpha = ContentAlpha.disabled)
): ButtonColors = DefaultButtonColors(
    backgroundColor = backgroundColor,
    contentColor = contentColor,
    disabledBackgroundColor = backgroundColor,
    disabledContentColor = disabledContentColor
)

为了实现您的目标,如果您不更改主色,您可以定义自定义主题并覆盖文本按钮的样式。

@Composable
fun CustomTextButtonStyle(content: @Composable () -> Unit) {
    MaterialTheme(
        colors = MaterialTheme.colors.copy(
            primary = Color.Green // Set your custom color
        )
    ) {
        content()
    }
}
CustomTextButtonStyle() {
    TextButton(onClick = { }) {
        Text(text = "Hello")
    }
}

在标题中它说你想为深色主题定义 textColor。您是否在 values-night 中定义了主题,因此如果 phone 处于深色模式,您的应用程序将采用这些值。

根据 Buttons -Material design 文档,TextButton 有一个默认的样式主题属性 ?attr/borderlessButtonStyle,可以在 AppTheme 中使用它来全局更改所有 material 的样式文本按钮。

要全局更改所有 TextButton 的文本颜色:

1.Define Light and Night AppTheme 中的 borderlessButtonStyle 属性如下所示:

<!-- Base application theme. -->
<style name="MyAppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
  <item name="borderlessButtonStyle">@style/Widget.App.Button.TextButton</item>
</style>

<!-- For TextButton-->
<style name="Widget.App.Button.TextButton" parent="Widget.MaterialComponents.Button.TextButton">
  <item name="materialThemeOverlay">@style/ThemeOverlay.App.Button.TextButton</item>
</style>

<style name="ThemeOverlay.App.Button.TextButton" parent="">
  <item name="colorPrimary">@android:color/holo_red_dark</item>
</style> 

2.In 每个 TextButton xml 布局定义样式 style="?attr/borderlessButtonStyle" 如下所示:

<Button
    style="?attr/borderlessButtonStyle"
    android:id="@+id/text_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Text Button" />

并且文本颜色将根据 Light/Night 主题中定义的 colorPrimary 进行全局更改。

按照相同的方式,您可以为其他 Material 按钮样式实现相同的效果,例如 OutlinedButton 和默认的 Button,例如:

<!-- Base application theme. -->
<style name="MyAppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
    <item name="borderlessButtonStyle">@style/Widget.App.Button.TextButton</item>
    <item name="materialButtonOutlinedStyle">@style/Widget.App.Button.OutlinedButton</item>
    <item name="materialButtonStyle">@style/Widget.App.Button</item>
</style>


<!-- For TextButton-->
<style name="Widget.App.Button.TextButton" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="materialThemeOverlay">@style/ThemeOverlay.App.Button.TextButton</item>
</style>

<style name="ThemeOverlay.App.Button.TextButton" parent="">
    <item name="colorPrimary">@android:color/holo_red_dark</item>
</style>

<!-- For OutlinedButton-->
<style name="Widget.App.Button.OutlinedButton" parent="Widget.MaterialComponents.Button.OutlinedButton">
    <item name="materialThemeOverlay">@style/ThemeOverlay.App.Button.OutlinedButton</item>
</style>

<style name="ThemeOverlay.App.Button.OutlinedButton" parent="">
    <item name="colorPrimary">@android:color/holo_orange_dark</item>
</style>

<!-- For Button -->
<style name="Widget.App.Button" parent="Widget.MaterialComponents.Button">
    <item name="materialThemeOverlay">@style/ThemeOverlay.App.Button</item>
</style>

<style name="ThemeOverlay.App.Button" parent="">
    <item name="colorPrimary">@android:color/holo_blue_dark</item>
    <item name="colorOnPrimary">@android:color/holo_blue_bright</item>
</style>

并且每个Button监听上面的全局属性:

<Button
    style="?attr/borderlessButtonStyle"
    android:id="@+id/text_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Text Button" />

<Button
    style="?attr/materialButtonOutlinedStyle"
    android:id="@+id/outlined_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Outlined Button" />

<Button
    android:id="@+id/default_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Default Button" />

以下是浅色模式下每种按钮样式的示例结果:

下面是夜间模式下每种按钮样式的示例结果: