【问题标题】:custom TextView that can change background color可以更改背景颜色的自定义 TextView
【发布时间】:2020-03-07 22:21:54
【问题描述】:

我在kotlin中写了一个自定义textview,它用作选择按钮。 意思是,在未选中的状态下,它有一个带角的灰色背景,而在选中的状态下,它的背景会改变颜色。

(按钮中间有文字)

问题: 我需要显示一整组这些按钮,并且对于每个按钮,选定状态的颜色可以随按钮的不同而变化。

所以如果我有:Button1、Button2、Button3,对于它们中的每一个,当它们被选中时,背景颜色是不同的。

我能以某种方式控制可绘制 xml 使用的颜色吗?

按钮背景:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:padding="10dp"
    android:shape="rectangle" >
    <solid android:color="@color/dynamicColor" /> --> how can I control this color?

    <corners
        android:bottomLeftRadius="20dp"
        android:bottomRightRadius="20dp"
        android:topLeftRadius="20dp"
        android:topRightRadius="20dp" />
</shape>

【问题讨论】:

  • 你可以创建一个StateListDrawable,它有状态

标签: android kotlin


【解决方案1】:

是的,您可以通过编程方式更改可绘制文件的Solid color。像下面这样。

val drawable = view.getBackground() as GradientDrawable // here view is your textview reference.
drawable.setColor(Color.GREEN) // set your color here

【讨论】:

  • 谢谢,它很简约,完全符合我的需要。我实际上尝试使用 GradientDrawable 但它崩溃了。奇怪,我可能错过了什么。无论如何,由于我的问题是针对 Kotlin,请在自定义视图类中使用时添加 kotlin 版本:drawable = background as GradientDrawable drawable.setColor(Color.Green)
  • 我已经更新了我对 kotlin 的回答。您也可以为我的回答点赞。
【解决方案2】:

在res/drawable/文件夹下创建BtnStateDrawable.xml,然后设置不同的状态ShapeDrawable。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:constantSize=["true" | "false"]
    android:dither=["true" | "false"]
    android:variablePadding=["true" | "false"] >
    <item
        android:drawable="@[package:]drawable/drawable_resource" . //here is your shapedrawable
        android:state_pressed=["true" | "false"]
        android:state_focused=["true" | "false"]
        android:state_hovered=["true" | "false"]
        android:state_selected=["true" | "false"]
        android:state_checkable=["true" | "false"]
        android:state_checked=["true" | "false"]
        android:state_enabled=["true" | "false"]
        android:state_activated=["true" | "false"]
        android:state_window_focused=["true" | "false"] />
</selector>


【讨论】:

  • 谢谢,第二种方案使用起来更方便一些,所以我接受了。不过,我也一定会看看这个解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 2011-12-26
  • 2014-06-12
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
相关资源
最近更新 更多