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

按钮背景的Colorstatelist不工作

巫马修然
2023-03-14

参考:如何在颜色状态列表资源中指定背景颜色?

我已经按照上面链接中流行的答案。

我有以下绘图;

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true"
        android:drawable="@color/KeyActionPrimary"/> <!-- enabled -->
    <item android:state_enabled="false"
        android:drawable="@color/KeyActionButtonDeactivated"/> <!-- disabled -->
    <item android:state_pressed="true"
        android:drawable="@color/KeyActionPrimary"/> <!-- pressed -->
    <item android:state_focused="true"
        android:drawable="@color/KeyActionPrimary"/> <!-- focused -->
    <item android:drawable="@color/KeyActionPrimary"/> <!-- default -->
</selector>

我理解,它将始终遵循优先顺序,因此在当前顺序中,只有激活和停用可能被触发。然而,目前我没有得到任何结果

我的按钮;

<Button
        android:id="@+id/buttonSTART"
        android:layout_width="@dimen/btn_width"
        android:layout_height="@dimen/btn_height"
        android:layout_marginStart="4dp"
        android:layout_marginEnd="4dp"
        android:layout_marginBottom="16dp"
        android:background="@drawable/state_controlled_key_action_button"
        android:padding="@dimen/btn_padding"
        android:text="@string/btn_start"
        android:textColor="@color/key_action_button_text_color"
        app:autoSizeTextType="uniform"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/btnSCORES"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent" />

按钮显示为白色,在我的材质主题中,这是色彩主属性

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.Home" parent="Theme.MaterialComponents">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/Primary</item>
        <item name="colorPrimaryVariant">@color/PrimaryVariant</item>
        <item name="colorSecondary">@color/Secondary</item>
        <item name="colorSecondaryVariant">@color/SecondaryVariant</item>
        <!--colorBackground appears behind scrollable content and is used for the default window-->
        <!--background. colorSurface is mapped to the surface of components such as cards, sheets-->
        <!--and menus. colorError is used to indicate an error state for components such as-->
        <!--text fields.-->
        <item name="android:colorBackground">@color/Background</item>
        <item name="colorSurface">@color/Surface</item>
        <item name="colorError">@color/Error</item>
        <!--"On" colors define how text, icons and strokes are colored in relation to the surface-->
        <!--on which they appear.-->
        <item name="colorOnPrimary">@color/ColorOnPrimary</item>
        <item name="colorOnSecondary">@color/ColorOnSecondary</item>
        <item name="colorOnBackground">@color/ColorOnBackground</item>
        <item name="colorOnSurface">@color/ColorOnSurface</item>
        <item name="colorOnError">@color/ColorOnError</item>

        <item name="android:fontFamily">@font/atma_medium</item>
        <item name="android:textColor">@color/PrimaryTextColor</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor" tools:targetApi="l">@color/StatusBar</item>
        <!-- Customize your theme here. -->

        <item name="actionBarSize">36dip</item>
    </style>

</resources>

首先,我假设一个主题覆盖了整个应用程序,但如果你明确指定一个特定按钮的背景,它应该覆盖主题值,如果我错了,请纠正我。

我从res/colors下的colorstate列表开始了这段旅程。阅读顶部的链接,确认您需要使用drawable。因为我已经有了一个颜色状态列表,最初是按照0票的答案的建议进行的。。。

形状

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
    <solid android:color="@color/primary_button_color" />
    <stroke android:width="@dimen/btn_stroke" android:color="@color/primary_button_stroke_color"/>
    <corners android:radius="@dimen/btn_radius"/>
</shape>

颜色状态表

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true"
        android:color="@color/Primary"/> <!-- pressed -->
    <item android:state_enabled="false"
        android:color="@color/PrimaryButtonDeactivated"/> <!-- pressed -->
    <item android:state_pressed="true"
        android:color="@color/Primary"/> <!-- pressed -->
    <item android:state_focused="true"
        android:color="@color/Primary"/> <!-- focused -->
    <item android:color="@color/Primary"/> <!-- default -->
</selector>

这两种方法都没有修改我的按钮颜色。我仍然总是看到一个白色的按钮。我特意选择了可怕的颜色来确保变化是明显的

我做错了什么?你还需要看什么?

使现代化

在与@rcs讨论之后,我使用res/color中的原始colorstatelist和按钮上的backgroundtint属性,它按预期工作

我的最终代码:

对于每个按钮,需要不同的风格,我有一个按钮颜色或文本颜色文件在res/颜色如下

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
        android:color="@color/KeyActionColorOnPrimary"/>
    <item android:state_enabled="true"
        android:color="@color/KeyActionPrimary"/>
    <item android:state_enabled="false"
        android:color="@color/lime"/>
    <item android:state_focused="true"
        android:color="@color/KeyActionPrimary"/>
    <item android:color="@color/KeyActionPrimary"/>
</selector>

然后在我的按钮xml

android:backgroundTint="@color/key_action_button_color" // for button color
android:textColor="@color/key_action_button_text_color" // for text color

例如

<Button
        android:id="@+id/buttonSTART"
        android:layout_width="@dimen/btn_width"
        android:layout_height="@dimen/btn_height"
        android:layout_marginStart="4dp"
        android:layout_marginEnd="4dp"
        android:layout_marginBottom="16dp"
        android:backgroundTint="@color/key_action_button_color"
        android:padding="@dimen/btn_padding"
        android:text="@string/btn_start"
        android:textColor="@color/key_action_button_text_color"
        app:autoSizeTextType="uniform"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/btnSCORES"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent" />

这不需要额外的样式。我可以保持我的材料设计主题没有按钮样式被设置为apt compat样式。我只使用上面的属性在布局xml为按钮我想有这些样式

共有1个答案

佴德曜
2023-03-14

因为您的color_state中的第一个条件是'android:state_enabled="true",这总是如此,从而导致相同的颜色。摆脱它注意到颜色的变化

参考官方文档了解更多信息,并尝试使用颜色文件资源,而不是文档中所说的可绘制

ColorStateList是从应用程序资源目录的“color”子目录中定义的XML资源文件创建的

编辑:

如本回答中所述,将colorstate作为样式应用于按钮标记应该可以解决此问题

创建新样式

    <style name="AppTheme.CustomButtonStyle" parent="@style/Widget.AppCompat.Button.Colored">
        <item name="android:backgroundTint">@color/state_controlled_key_action_button</item>
    </style>

活动

    <Button
        android:id="@+id/your_button_id"
        style="@style/AppTheme.CustomButtonStyle"/>

 类似资料:
  • 我对改变晶圆厂的背景色有一个问题,似乎晶圆厂后面有另一个背景 这是我的代码 现在唯一有效的解决方案是改变我的应用程序上的颜色口音,但它会影响其他UI元素

  • 本文向大家介绍使用CSS更改按钮的背景色,包括了使用CSS更改按钮的背景色的使用技巧和注意事项,需要的朋友参考一下 要更改按钮的背景色,请使用background-color属性。 您可以尝试运行以下代码来更改按钮的背景色 示例

  • 我有一个Java应用程序,它使用本机LAF,如下所示: 这是伟大的工作,然而,我试图使一个按钮有一个红色的背景,但最终像这样: 正如你所看到的,我在按钮上设置了背景和前景,但结果并不令人满意。有没有一种方法可以让按钮在不子类化JButton的情况下绘制红色背景?

  • 我已经创建了一个类,它扩展了。在该类中,当我按下一个按钮时,我想更改一个按钮的背景,该按钮被放置在主活动中。 我试图创建一个内部类来访问Main Active对象,但我得到的是这个错误: 尝试在空对象引用上调用虚拟方法android.content.pm.Application ationInfoandroid.content.Context.getApplication ationInfo()

  • 我正在尝试制作一个调查应用程序,学习一些关于FragmentContainerView和导航图的知识。当我使用现有的小部件(如radiobuttons或checkboxes)来获取答案时,所有的工作都很完美。 当我尝试制作自己的小部件或更改一个普通按钮的行为以使其行为如以下屏幕截图所示时,问题就出现了: 该行为与ToggleButton类似,但我不想更改文本(开/关文本)。我需要的是,当我点击按钮

  • 解决方案见Deepa答案:) 我阅读了StackOverFlow中给出的所有解决方案,但在我的情况下似乎没有一个可行。问题是我的应用程序中有几个按钮,它们会对用户的操作做出不同的反应。例如,当应用程序启动时,除了两个按钮之外,所有按钮都被禁用。因此我将默认的drawable设置到XML中。当我打开一个文件时,所有这些都是可点击的,但其中一些,当按下时,需要保持按下(我已经这样做了),但其他的只是需