为单一颜色创建可绘制对象

3

我有一个按钮,当点击它时,我希望文本的颜色从白色变为黄色。我在我的drawable文件夹中创建了一个选择器XML文件。我的问题是,我不知道如何在状态state_pressed为true时设置文字的颜色。我尝试使用十六进制数,但一直收到以下错误信息:

<item> tag requires a 'drawable' attribute or child tag defining a drawable

我假设颜色必须来自我的drawable文件夹?我终于找到了这个解决方案,但我只能使用有限数量的颜色。

<item
    android:state_pressed="true"
    android:drawable="@android:color/holo_blue_light">
</item>

我该如何解决这个问题?我可以在drawable文件夹中创建一个仅包含一个颜色的单独的XML文件来引用吗?如果可以,我该如何实现?还是有更简单的解决方案吗?谢谢。

5个回答

5

bg_color_white.xml

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

          <solid android:color="@android:color/white" />

</shape>

5

首先在您的应用程序/资源/值中创建一个colors.xml资源文件,例如下面这个:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="gray">#D2D2D2</color>
    <color name="dark_gray">#ff838383</color>
    <color name="transparent_black">#1A000000</color>
</resources>

然后您可以使用在colors.xml中定义的颜色来创建选择器。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:state_pressed="false" android:color="@color/gray" />
    <item android:state_focused="true" android:state_pressed="true" android:color="@color/dark_gray" />
    <item android:state_focused="false" android:state_pressed="true" android:color="@color/dark_gray" />
    <item android:color="@color/transparent_black" />
</selector>

将XML文件放在res/drawable文件夹中,即res/drawable/button_text_color.xml。然后只需将可绘制对象设置为按钮的文本颜色:

android:textColor="@drawable/button_text_color"

1
在您的Drawable文件夹中创建一个名为“myCustomDrawable”的XML文件,如下所示:

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

“deepPurple”和“lightPurple”在...values/colors.xml中定义为:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name = "deepPurple">#673AB7</color>
    <color name = "lightPurple">#D1C4E9</color>
</resources>

然后在您的活动布局中,将Drawable文件分配给按钮,如下所示:

<Button 
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content"
  ... 
  ... 
  android:textColor="@drawable/myCustomDrawable" 
  ... 
  .../>


1

我仍然不断地遇到相同的错误,但是这些回复帮助我找出了问题。问题在于我的选择器语法:

<item
android:state_pressed="true"
android:drawable="@android:color/holo_blue_light"> </item>

语法必须以android:drawable=开头,否则我一遍又一遍地收到相同的错误。例如,如果我使用:
 android:color="@color/gray"

或者

<solid android:color="@color/gray" />

它一直产生这个错误:

<item> tag requires a 'drawable' attribute or child tag defining a drawable

所以,就像建议的那样,我在我的values文件夹中创建了一个名为colors的XML文件,并创建了我想要使用的颜色:

<resources>
<color name = "light_blue">#33b5e5</color>
</resources>

然后我可以在我的选择器文件中使用它,如下所示:

android:drawable="@color/light_blue""

0
下面是所谓的可绘制选择器示例。
将其放在 /drawable 文件夹下。
当您看到 android:state_pressed="true" 时,这将定义按钮按下时发生的事情。这是您设置为黄色的颜色。
state_focused="true" 是当手指按住按钮但没有释放时,因此它具有焦点。您可能想在这里将颜色更改为黄色。
<?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="3dip" />
             <stroke android:width="1dip" android:color="#39678c" />
             <gradient android:angle="-90" android:startColor="#39678c" android:endColor="#39678c"  />    
             <size android:width="75dp" android:height="25dp"/>

         </shape>
     </item>
    <item android:state_focused="true">
         <shape android:shape="rectangle"  >
             <corners android:radius="8dip" />
             <stroke android:width="1dip" android:color="#696969" />
             <solid android:color="#696969"/>  
             <size android:width="75dp" android:height="25dp"/>     
         </shape>
     </item>  
    <item >
        <shape android:shape="rectangle"  >
             <corners android:radius="8dip" />
             <stroke android:width="1dip" android:color="#39678c" />
             <gradient android:angle="-90" android:startColor="#39678c" android:endColor="#39678c" />  
             <size android:width="75dp" android:height="10dp"/>          
         </shape>
     </item>
    </selector>

我假设你不希望在用户松开按钮后颜色保持为黄色。但是如果你希望在用户松开按钮后颜色仍然保持为黄色,你可能需要使用其他方法。 - TerNovi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接