【问题标题】:Programatically make TextView background color change while pressed按下时以编程方式使 TextView 背景颜色发生变化
【发布时间】:2014-07-07 02:08:22
【问题描述】:

我有一些 TextViews 动态添加到 LinearLayout。这些TextView都是可点击的,并且有一个onLongClickListener(我也打算以后加上onClickListener)

事情是这样的,我希望这些 TextView 在按下时改变它们的背景颜色,我读到你可以使用选择器来做这样的事情。

所以我在 res/drawable/text_view_pressed.xml 中制作了这个 xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
        android:color="#000000"/>
    <item android:state_pressed="false"
        android:color="#FFFFFF"/>
</selector>

我尝试创建一个 TextView 并像这样使用这个 xml 文件:

TextView t = new TextView(this);
t.setBackgroundColor(R.drawable.text_view_pressed);

但是当我这样做时,它会在 t.setBackgroundColor 中给出这个错误:“应该在这里传递解析的颜色而不是资源 ID:getResources().getColor(R.color.text_view_pressed)”但它不能作为如果我使用 getResources().getColor(R.color.text_view_pressed)。

有人知道怎么做吗?

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    你在正确的轨道上。但是有一个重要的细节。

    有两种类型的资源会受到状态的影响:ColorStateListStateListDrawable

    颜色状态列表只能在某些上下文中使用,例如在TextView.setTextColor() 中。据我所知,如果您想在按下 View 时更改其背景,则不能使用颜色状态列表作为 setBackgroundColor() 的参数。为此,您需要一个可绘制的状态列表。而在可绘制的状态列表中,android:drawable 属性是强制性的。

    所以,总结一下:

    • xml文件应该放在res\drawable
    • 它的结构应该略有不同(即状态列表,而不是颜色列表),并且
    • 您需要使用setBackgroundResource() 而不是setBackgroundColor()

    示例文件:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true" android:drawable="@android:color/white" />
        <item android:drawable="@android:color/black"/>
    </selector>
    

    如果您想使用自定义颜色而不是白色和黑色,您只需 define them as resources in res\values 并从此处引用它们。

    【讨论】:

    • 感谢您的提示。我按照你说的做了,但应用程序现在停止了一个致命的异常。 07-06 23:18:21.330: E/AndroidRuntime(4480): java.lang.RuntimeException: 无法启动活动 ComponentInfo{br.rodrigo.davy.vazdividiraconta/br.rodrigo.davy.vazdividiraconta.MainActivity}: android.content .res.Resources$NotFoundException:文件 res/drawable/text_view_pressed.xml 来自可绘制资源 ID #0x7f020058
    • @Rodrigo 是的,一个推论是文件应该放在 res\drawable 中。很抱歉没有提到这一点
    • 感谢您的好意!当您之前提到“选择器是 StateListDrawable,一种可绘制对象”时,我已经将文件夹更改为 res\drawable。不过,它仍然给我同样的错误。
    • @Rodrigo 嗯?奇怪的。您是否尝试过刷新和清理项目?
    • 刚刚尝试刷新和清理。我什至尝试在我的手机和平板电脑上运行该应用程序。结果总是一样的......
    猜你喜欢
    • 1970-01-01
    • 2023-01-17
    • 2012-07-31
    • 2021-05-15
    • 2012-08-30
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多