state_pressed在色彩选择器中不起作用,用于图像视图的色调

时间:2017-08-30 11:42:24

标签: android android-layout

我在以下网站中使用的视图代码:

<ImageView
            android:layout_width="20dp"
            android:layout_height="25dp"
            android:background="@drawable/ic_bookmark_border_black_24dp"
            android:layout_below="@+id/author"
            android:layout_alignRight="@+id/dots"
            android:tint="@color/bookmark_color_selector"
            android:id="@+id/bookmark"/>

颜色选择器的代码:

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

更多信息:我在cardView中使用此视图,然后在recyclelerView中使用。图标的色调保持白色。在触摸它时不会改变(就像我想要的那样)黑色。

2 个答案:

答案 0 :(得分:0)

在选择器

中添加此行
android:background="@color/white" 
android:state_focused="true"

答案 1 :(得分:0)

您必须进行一些更改。首先,从<ImageView>标记中删除这两行:

        android:background="@drawable/ic_bookmark_border_black_24dp"
        android:tint="@color/bookmark_color_selector"

并添加以下行:

        android:clickable="true"

然后,在您的Java代码中,无论您在哪里夸大此ImageView(可能在您的活动的onCreate()方法中),请添加以下代码:

    ImageView bookmark = (ImageView) findViewById(R.id.bookmark);
    Drawable icon = ContextCompat.getDrawable(this, R.drawable. ic_bookmark_border_black_24dp);
    ColorStateList tint = ContextCompat.getColorStateList(this, R.color.bookmark_color_selector);
    DrawableCompat.setTintList(icon, tint);
    bookmark.setImageDrawable(icon);

这里发生了什么?

基本上,ImageView在API 21之前不支持基于选择器的着色,因此您必须使用支持库方法才能使其工作。 ContextCompat方法允许您访问图像和颜色选择器,然后DrawableCompat方法实际上将色调应用于图像。最后,您必须使ImageView“可点击”,否则它将永远不会处于按下状态。

修改 我刚刚注意到你说你在RecyclerView内使用了这个。因此,我上面发布的Java代码必须位于onCreateViewHolder()onBindViewHolder()。因此,this不是Context方法的ContextCompat实例的有效引用;而是使用itemView.getContext()