当前位置: 首页 > 知识库问答 >
问题:

以编程方式将样式应用于MaterialButton

贡念
2023-03-14

我试图创建一个从MaterialButton扩展而来的自定义视图,并在代码中应用样式,这样我就不需要在xml中这样做。

class CustomRedButton @JvmOverloads constructor(
    context: Context, 
    attrs: AttributeSet? = null, 
    defStyleAttr: Int = 0
) : MaterialButton(ContextThemeWrapper(context, R.style.ButtonRedStyle), attrs, defStyleAttr) 

风格是:

<style name="ButtonRedStyle" 
    parent="Widget.MaterialComponents.Button.TextButton">
    <item name="backgroundTint">@color/red</item>
    <item name="rippleColor">@color/grey</item>
    <item name="strokeWidth">1dp</item>
    <item name="strokeColor">@color/black</item>
</style>

一切正常,但backgroundTintproperty。由于某种原因,背景色并没有改变,它有主题的原色。但是,如果我尝试将样式应用于xml中的MaterialButton,它确实会改变颜色。

你知道为什么会这样,或者我怎样才能做到吗?

共有3个答案

龙昊焱
2023-03-14

如果您想更改CustomView的样式,您必须将其传递给构造函数,方法是将其传递给第三个参数desStyleAttr,如下所示:

class CustomRedButton @JvmOverloads constructor(
    context: Context, 
    attrs: AttributeSet? = null, 
    defStyleAttr: Int = R.style.ButtonRedStyle // Just default style like this
) : MaterialButton(context, attrs, defStyleAttr)

你可以通过编程的方式初始化它,

CustomRedButton(this, null, R.style.ButtonRedStyle) // Initialization, ('this' is context)

有关更多详细信息,请参阅此处

殷宇
2023-03-14

我也面临同样的问题。到目前为止,我找到的唯一解决方法是以编程方式设置色调,如下所示:

button.setBackgroundTintList(ColorStateList.valueOf(Color.RED));
司空和悌
2023-03-14

使用

MaterialButton(ContextThemeWrapper(context, R.style.ButtonRedStyle), attrs, defStyleAttr)

您正在将themeoverlay应用于默认样式,而不是应用其他样式。

这意味着:

<style name="ButtonRedTheme" parent="...">
    <item name="colorPrimary">@color/...</item>
    <item name="colorOnPrimary">@color/...</item>
    <item name="colorSecondary">@color/...</item>
</style>

如果要应用不同的样式,必须:

  • attrs中定义自定义属性。xml
    <attr name="myButtonStyle" format="reference"/>
  • 在应用程序主题中将样式分配给此属性:
xml prettyprint-override">   <style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
        <item name="myButtonStyle">@style/CustomButtonStyle</item>
   </style>
  • 定义自定义样式:
    <style name="CustomButtonStyle" parent="Widget.MaterialComponents.Button.*">
        <item name="backgroundTint">@color/...</item>
        <item name="rippleColor">@color/grey</item>
        <item name="strokeWidth">1dp</item>
        <item name="strokeColor">@color/black</item>
    </style>

最后使用:

val customButton = MaterialButton(context, null, R.attr.myButtonStyle)
 类似资料:
  • 有没有办法以编程方式自定义这些TextInputLayout属性: textColorHint 彩色口音 颜色控制正常 颜色控制已激活 文本选择句柄 我知道如何使用主题属性对它们进行样式化,但是我正在处理的项目动态地加载颜色信息,据我所知,在运行时无法更改主题/样式值。

  • 如何以编程方式设置属性?

  • 问题内容: 有没有办法将应用程序发送到后台?与如何调用类似,我有一些UI元素可以测试。有谁知道这是否完全可能? 问题答案: 我建议退房。这是您可以按“主页”按钮然后重新启动应用程序的方法

  • 问题内容: 我需要重新启动我的应用程序,以防万一我重新加载需要从一开始就开始的内容。我试过了 但我收到一个错误 启动路径不可访问 问题答案: 尽管问题本身是微不足道的(忘记了路径),但在其他人需要相同功能的情况下,我还是留下了疑问。 编辑 (Sw3的每日Swift语法更改; Sw4也适用):

  • 问题内容: 使用标签将SVG直接包含在文档中时,您可以通过文档的样式表将CSS样式应用于SVG。但是,我试图将一种样式应用于嵌入的SVG(使用标签)。 是否可以使用以下代码? 问题答案: 简短的答案:不,因为样式不适用于文档边界。 但是,由于有标签,因此可以使用脚本将样式表插入svg文档。 这样的事情,并请注意,此代码假定已完全加载: 也可以插入一个元素来引用外部样式表: 另一个选择是使用第一种方

  • 我正在尝试使用我自己的应用程序实现或扩展的ResourceConfig或PackageResourceConfig来配置我的Jersey应用程序。因此,我的第一次尝试是将现有的web.xml(实际上,由于开发的库性质,我使用的是web-fragment.xml)配置移植到MyApplication实现。 当我使用第二个版本时,我会收到以下信息 正如您所看到的,是第一个注册的类,但由于它不是公共的,