gpt4 book ai didi

android - 以编程方式将 MaterialButton 样式设置为 TextButton

转载 作者:行者123 更新时间:2023-12-02 13:32:32 27 4
gpt4 key购买 nike

我想创建一个 MaterialButton以编程方式使用 TextButton风格就可以了。

我尝试了以下操作,但生成的按钮有背景颜色,而不是 TextButton .

val newContext = ContextThemeWrapper(this, R.style.Widget_MaterialComponents_Button_TextButton)
val errorBtn = MaterialButton(newContext, null, R.style.Widget_MaterialComponents_Button_TextButton)

我尝试了许多变体(不使用 3 参数构造函数或不使用上下文包装器)。

我发现了这个问题: Apply Style to MaterialButton programmatically

但答案并不令人满意,因为设置背景色调不会产生良好的效果(按钮有阴影)。

最佳答案

在阅读了 Material 设计源之后,我发现了以下内容。第三个参数为MaterialButton不是样式资源,而是样式属性。该参数称为defStyleAttr而不是 defStyleRes ,只有第二个相当于通过style在 XML 文件中。和MaterialButton不要实现接受这个的 4 参数构造函数。

澄清一下,样式资源是“独立”样式定义,样式属性是上下文样式中属性的名称。您应该使用一个属性为整个小部件设置样式有点奇怪,但这就是它的工作原理。

这意味着,我们必须创建引用整个小部件样式的属性,并在创建按钮时传递它。

为此,我们必须:

  • 创建 attr应用资源中的资源,通过添加 <attr name="myAttr" format="reference"/>styles.xml .
  • 还在 styles.xml ,修改app主题使用属性,像这样:

  • <style name="AppTheme" parent="Theme.MaterialComponents.NoActionBar">
    <item name="myAttr">@style/Widget.MaterialComponents.Button.TextButton</item>
    </style>
  • 创建按钮时使用该属性,如下所示:
  • val errorBtn = MaterialButton(this, null, R.attr.myAttr)

    这仅在 this 时有效。 (当前上下文,通常是一个 Activity )有 AppTheme适用于它(通常应该是这种情况)。如果不是这种情况,或者如果您想更改主题,可以使用 ContextThemeWrapper ,像这样:
    val ctx = ContextThemeWrapper(this, R.style.AppTheme)
    val errorBtn = MaterialButton(ctx, null, R.attr.myAttr)

    关于android - 以编程方式将 MaterialButton 样式设置为 TextButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60590968/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com