如何更改按钮颜色

时间:2014-08-08 15:40:01

标签: android android-layout button

我的按钮很少。 我想在按下按钮时更改按钮的颜色。 并将其他按钮的颜色更改为正常状态。

问题是在简单地改变按钮的背景后, 它的形状也发生了变化。更改颜色后默认android 带阴影的按钮 只是用带有更多按钮高度的彩绘矩形代替。 是。可以将普通按钮和按下位置的按钮定义为可绘制的XML。 但我想使用默认的android按钮而不是花哨的。

我的代码如下:

        buttonAny.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            buttonAny.setBackgroundColor(COLOR_BUTTON_SELECTED);
            buttonMale.setBackgroundColor(COLOR_BUTTON_GRAY);
            buttonFemale.setBackgroundColor(COLOR_BUTTON_GRAY);
        }
    });

    buttonMale.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            buttonAny.setBackgroundColor(COLOR_BUTTON_GRAY);
            buttonMale.setBackgroundColor(COLOR_BUTTON_SELECTED);
            buttonFemale.setBackgroundColor(COLOR_BUTTON_GRAY);
        }
    });

XML:

    <Button
        android:id="@+id/buttonGenderAny"
        android:layout_marginLeft="@dimen/dim1"
        android:layout_marginRight="@dimen/dim1"
        android:gravity="center"
        android:layout_centerHorizontal="true"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:text='Any'
        android:textColor="@color/text1"
        android:textAppearance="?android:attr/textAppearanceSmall" />

<Button
        android:id="@+id/buttonGenderMale"
        android:layout_marginLeft="@dimen/dim1"
        android:layout_marginRight="@dimen/dim1"
        android:gravity="center"
        android:layout_centerHorizontal="true"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:text='Male'
        android:textColor="@color/text1"
        android:textAppearance="?android:attr/textAppearanceSmall" />

启动后我的应用程序如下所示 pic1 (抱歉,我无权发布图片)

按下按钮后,如下所示: pic2

很奇怪,按钮的大小已经改变了。

谷歌有很多类似的问题。 但似乎他们不适合我。 例如this link。 但是没有写出如何在drawable中定义普通按钮或按下按钮。

因此。更改(切换)几个按钮的颜色的最佳方法是什么。 谢谢!

6 个答案:

答案 0 :(得分:0)

您需要做的就是在drawable文件夹中创建一个xml文件,该文件夹将根据按下或未按下的状态设置按钮的背景颜色。 例如,创建一个文件并将其命名为button_background.xml并将其放在drawable文件夹中。在文件中放入以下内容

    <item android:state_pressed="true" >
    <shape android:shape="rectangle">
        <solid android:color="#449def" />
    </shape>
</item>
<item>
    <shape android:shape="rectangle">
           <solid android:color="#2f6699" />
</item>

然后在你的按钮背景属性

<Button
   android:background="@drawable/button_background"/>

您可以根据自己的喜好编辑button_background文件中的颜色。

答案 1 :(得分:0)

在您的drawable资源下创建一个新的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="3dip" />
             <stroke android:width="1dip" android:color="#c53e2b" />
             <gradient  android:angle="-90"  android:startColor="#a11005" android:endColor="#d62608"  />            
         </shape>
     </item>
    <item android:state_focused="true">
         <shape android:shape="rectangle"  >
             <corners android:radius="3dip" />
             <stroke android:width="1dip" android:color="#c53e2b" />
             <solid  android:color="#e0341e"/>       
         </shape>
     </item>  
    <item >
        <shape android:shape="rectangle"  >
             <corners android:radius="3dip" />
             <stroke android:width="1dip" android:color="#c53e2b" />
             <gradient  android:angle="-90"  android:startColor="#ff6c52" android:endColor="#e0341e" />            
         </shape>
     </item>
</selector>

然后在点击监听器aplyy就像这样......

 buttonMale.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            buttonAny.setBackgroundResource(R.drawable.YOUR_XML_NAME);
            buttonMale.setBackgroundResource(R.drawable.YOUR_XML_NAME);
            buttonFemale.setBackgroundResource(R.drawable.YOUR_XML_NAME);
        }
    });

答案 2 :(得分:0)

是的,请勿尝试更改onClick事件中的按钮颜色。

您要找的是StateListDrawable。例如,查看Android平台如何定义可绘制的btn_default_holo_light。您将需要完全遵循此模式,为不同的状态提供您自己的drawable(例如PNG图像)。

一旦你创建了这些drawable,你只需在你的布局文件中引用它就像这样

<Button
    ...
    android:background="@drawable/my_fancy_button_background" />

答案 3 :(得分:0)

不要尝试更改代码中的颜色,只需对所有按钮使用selector作为每个按钮的background属性。

选择器:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_selected="true"><color android:color="@color/button_background_pressed" />
</item>
<item android:state_pressed="true"><color android:color="@color/button_background_pressed" />
</item>
<item><color android:color="@color/button_background" />
</item>

</selector>

修改 您可以在selector文件夹中使用上述XML创建drawable,并将其用作background "@drawable/selector_button"

编辑2:

而不是像这样使用它:

<Button
    android:id="@+id/buttonGenderMale"
    android:layout_marginLeft="@dimen/dim1"
    android:layout_marginRight="@dimen/dim1"
    android:gravity="center"
    android:layout_centerHorizontal="true"
    android:layout_width="match_parent"
    android:layout_height="0dip"
    android:layout_weight="1"
    android:text='Male'
    android:textColor="@color/text1"
    android:textAppearance="?android:attr/textAppearanceSmall" />

像这样使用:

<LinearLayout
   android:layout_width="match_parent"
   android:layout_height="0dip"
   android:layout_weight="1"
   android:orientation="vertical" >

   <View 
    android:layout_width="match_parent"
    android:layout_height="1dip" />

   <Button
    android:id="@+id/buttonGenderMale"
    android:layout_marginLeft="@dimen/dim1"
    android:layout_marginRight="@dimen/dim1"
    android:gravity="center"
    android:layout_centerHorizontal="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text='Male'
    android:textColor="@color/text1"
    android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>

根据按钮之间的距离调整View

答案 4 :(得分:0)

你可以这样做,创建一个xml文件int project&res / drawable,例如:&#34; buttonGenderAny_bg.xml&#34;:

<?xml version="1.0" encoding="utf-8"?>

<item android:drawable="COLOR_BUTTON_SELECTED" android:state_pressed="true"/>
<item android:drawable="COLOR_BUTTON_SELECTED" android:state_focused="true"/>
<item android:drawable="COLOR_BUTTON_SELECTED" android:state_selected="true"/>
<item android:drawable="COLOR_BUTTON_GRAY"/>

然后在布局xml文件中设置按钮的背景,例如:

<Button
    android:id="@+id/buttonGenderMale"
    android:layout_marginLeft="@dimen/dim1"
    android:layout_marginRight="@dimen/dim1"
    android:gravity="center"
    android:layout_centerHorizontal="true"
    android:layout_width="match_parent"
    android:layout_height="0dip"
    android:layout_weight="1"
    android:text='Male'
    android:textColor="@color/text1"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:background="@drawable/buttonGenderAny_bg"/>

答案 5 :(得分:0)

实际上几个月前我也用按钮做过这样的事情,但是我不推荐它。我认为根据您的情况,使用单选按钮要简单得多。

This就是它的样子!

使用RadioGroup方法的优点是您不必管理&#34;按钮的颜色状态&#34;

要设置以下3或4个文件是必需的(这是我的 EXACT 用法,但我还提供了一些关于如何获得它的提示,如下所示):

布局:

<RadioGroup
    android:id="@+id/sortOptionsBar"
    style="?android:attr/buttonBarStyle"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:checkedButton="@+id/rbSortOption1"
    android:orientation="horizontal" >

    <RadioButton
        android:id="@+id/rbSortOption1"
        style="@style/menu_buttons"
        android:text="@string/sort_option1" />

    <RadioButton
        android:id="@+id/rbSortOption2"
        style="@style/menu_buttons"
        android:text="@string/sort_option2" />

    <RadioButton
        android:id="@+id/rbSortOption3"
        style="@style/menu_buttons"
        android:text="@string/sort_option3" />
</RadioGroup>

提示:上面我希望我看起来像一个酒吧,因为你切换了android:orientation =&#34;水平&#34;垂直。

values \ style.xml(将单选按钮的所有样式汇集在一起​​)

<style name="menu_buttons" parent="@android:style/Widget.Holo.Button.Borderless">
    <item name="android:textColor">@color/menu_button_text</item>
    <item name="android:background">@color/menu_button_background</item>
    <item name="android:button">@android:color/transparent</item>
    <item name="android:layout_weight">1.0</item>
</style>

重要的是要注意上面的android:按钮,这会隐藏radiobutton的复选框 您还可以删除我在我的栏中使用的android:layout_weight,以便所有单选按钮的宽度相等。 父=&#34; @android:style / Widget.Holo.Button.Borderless&#34;将允许您保持按钮大小相同。

颜色\ menu_button_background.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:state_pressed="true" android:drawable="@drawable/menu_button_unselected" />
    <item android:state_pressed="true" android:drawable="@drawable/menu_button_selected" />
    <item android:state_checked="true" android:drawable="@drawable/menu_button_selected" />
    <item android:drawable="@drawable/menu_button_unselected" />
</selector>

@ color / menu_button_text也可以这样做。 (例如,您可以在选择文本时反转文本的颜色)

然后知道在onCheckedChanged事件中选择了哪一个我做了这个。

int id = sortBar.getCheckedRadioButtonId();
switch (id) {
    case R.id.rbSortOption1:
        break;
    case R.id.rbSortOption2:
        break;
    case R.id.rbSortOption3:
        break;
    }