Android 自定义Drawable 资源引用问题

问题的复现:

Activity布局文件代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:clickable="true"
        android:layout_centerInParent="true"
        android:layout_width="100dp"
        android:layout_height="54dp"
        android:background="@drawable/color_bg_selector">
        <TextView
            android:layout_centerInParent="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="25sp"            android:textColor="@color/bg_color_text_selector"
            android:text="确定"/>
        </RelativeLayout>
</RelativeLayout>

就一个 按钮View,背景可改变, TextView 的字体颜色也可改变

color_bg_selector.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <corners android:radius="5dp"/>
            <stroke android:color="@color/btn_color_normal"
                android:width="3dp"/>
            <solid android:color="@android:color/white"/>
        </shape>
    </item>
    <item android:state_selected="true">
        <shape android:shape="rectangle">
            <stroke android:color="@color/btn_color_normal"
                android:width="3dp"/>
            <solid android:color="@android:color/white"/>
            <corners android:radius="5dp"/>
        </shape>
    </item>
    <item >
        <shape android:shape="rectangle">
            <stroke android:color="@color/btn_stoke_druck"
                android:width="3dp"/>
            <solid android:color="@android:color/white"/>
            <corners android:radius="5dp"/>
        </shape>
    </item>
</selector>

bg_color_text_selector.xml代码如下

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

代码只有一个按钮,实现点击的时候改变按钮的背景颜色,同时字体颜色也要改变,即我们期望的效果是:

对,没错,这只是我们期望的效果,现实往往跟期望是有出入的。

我们把代码跑起来,结果运行的效果是这样的:

如果你们觉得有疑问,可以把以上代码拷贝到工程中跑起来试试!

确实字体的颜色按下的时候没有改变,why ?why ?why ?why ?

明明设置了字体颜色为

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

我还曾一度怀疑是不是字体颜色不能这样设置?最后我把它改成跟上面bg_color_text_selector.xml顺序一样

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

我擦,有效果了!

这里可以得出结论:drawable 在读取状态的时候跟顺序有关系!

怎样能避免这种情况呢?

有两种方法:

1、不要偷懒,改写的全部写全,比如这里明明是

<item android:state_pressed="false" android:color="@color/txt_color_normal"/>

却把android:state_pressed=”false” 省略,导致的后果就是没有效果。

2、把不要的状态不要写在里面,比如这里

android:state_selected="true"

压根没用到,所以不要写进去,

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

这样也是有效果的。

时间: 2024-12-28 14:59:19

Android 自定义Drawable 资源引用问题的相关文章

android中drawable资源的解释及例子

文章中的内容参考Dev Guide中的Drawable Resources,英文好的朋友可以直接去读英文.总结这篇文章的目的是自己在使用drawable资源遇到一些问题跟大家分享下,同时整理下自己对drawable的理解. drawable资源共有10种,包括Bitmap文件.Nine-Path文件.Layer List.State List.Level list.Transition Drawable.Inset Drawable.Clip Drawable.Scale Drawable.Sh

Android:安卓资源引用符号的含义

@代表引用资源 @*代表引用系统的非public资源,如: @*android:color/white @[package:]type/name引用自定义资源,如: android:text="@string/hello" ?代表引用主题属性 android:textColor="?android:textDisabledColor" @+代表在创建或引用资源 @+id/资源ID名 新建一个资源ID Android:安卓资源引用符号的含义

[转]android中drawable资源的解释及例子

原文链接:         http://blog.csdn.net/wode_dream/article/details/38584693 文章中的内容参考Dev Guide中的Drawable Resources,英文好的朋友可以直接去读英文.总结这篇文章的目的是自己在使用drawable资源遇到一些问题跟大家分享下,同时整理下自己对drawable的理解. drawable资源共有10种,包括Bitmap文件.Nine-Path文件.Layer List.State List.Level

初学Android 使用Drawable资源之使用ClipDrawable资源 十六

ClipDrawable代表从其它位图上截取一个"图片片段",XML中的根元素为<clip.../>,截取的方向由clipOrientation控制 下面以一个慢慢展开的图片为例 先定义一个ClipDrawable资源文件my_clip.xml <?xml version="1.0" encoding="utf-8"?> <clip xmlns:android="http://schemas.android

android的drawable资源

1.android中可以通过xml文件配置资源,比如字符串啦,整数拉.浮点数等等,当然也可以配置图片资源和选择器,下面我们就看看几种图片资源的配置. @1矩形方框,带渐变色的配置代码 <?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android">     <!--设置黑色边

Android 自定义Drawable

1.使用BitmapShader实现图片圆角 public class CornerDrawable extends Drawable { private Paint mPaint; private Bitmap bmp; private RectF rectF; public CornerDrawable(Bitmap bmp) { this.bmp = bmp; BitmapShader shader = new BitmapShader(bmp, Shader.TileMode.CLAMP

android自定义样式大全:shape,selector,layer-list,drawable,动画,style

原文:http://keeganlee.me/post/android/20150830 以下摘取了部分内容: shape 一般用shape定义的xml文件存放在drawable目录下,若项目没有该目录则新建一个,而不要将它放到drawable-hdpi等目录中.只需要在对应控件设置(bg_rectangle_with_stroke_dash.xml) android:background="@drawable/bg_rectangle_with_stroke_dash" 四种类型 使

Android中的Drawable资源

在Android应用中,常常会用到Drawable资源,比如图片资源等,在Android开发中我们是用Drawable类来Drawable类型资源的. Drawable资源一般存储在应用程序目录的\res\drawable目录下,当然依据分辨率的高低可以分别存储不同分辨率的资源到如下几个目录: \res\drawable-hdpi \res\drawable-ldpi \res\drawable-mdpi \res\drawable-xdpi 其SDK文档中声明如下: 我们看到Drawable是

Android入门——Drawable与对应的资源xml的应用

引言 Android 中的Drawable是一个抽象的概念,换言之所有能被画出来的都可以定义成Drawable(A Drawable is a general abstraction for "something that can be drawn." ).所以Android应用中使用最为广泛和最灵活的资源,不仅仅可以直接使用.png..9.png..gif..jpg等图片作为资源,还可以使用多种XML文件. 一.Drawable概述 Drawable同时也是一个抽象类,我们在Andr