Android按钮选择器

133

这是一个按钮选择器,当正常时它呈现为红色,按下时呈现为灰色。

我想问如何直接修改代码,使得在按下时文本大小和颜色也能改变?非常感谢!

<item android:state_pressed="true" >         
    <shape xmlns:android="http://schemas.android.com/apk/res/android"> 
        <stroke android:width="2dp" android:color="@color/black" />
        <solid android:color="@color/grey"/>
        <padding android:left="5dp" android:top="2dp" 
            android:right="5dp" android:bottom="2dp" /> 
        <corners android:radius="5dp" /> 
    </shape>    
</item>

<item>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"> 
        <stroke android:width="2dp" android:color="@color/black" />
        <solid android:color="#FF6699"/>
        <padding android:left="5dp" android:top="2dp" 
            android:right="5dp" android:bottom="2dp" /> 
        <corners android:radius="5dp" /> 
    </shape>
</item>

:段落标记,表示一个段落的开始和结束。
6个回答

235
您只需要在您的布局文件中设置buttonselector即可。
<Button
     android:id="@+id/button1"
     android:background="@drawable/selector_xml_name"
     android:layout_width="200dp"
     android:layout_height="126dp"
     android:text="Hello" />

完成。

编辑

以下是drawable目录中button_effect.xml文件:

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

    <item android:drawable="@drawable/numpad_button_bg_selected" android:state_selected="true"></item>
    <item android:drawable="@drawable/numpad_button_bg_pressed" android:state_pressed="true"></item>
    <item android:drawable="@drawable/numpad_button_bg_normal"></item>

</selector>
在这里,你可以看到有3个drawable,你只需要将这个样式放到你的

请问您能否详细说明如何设置按下和非按下状态(包括圆形颜色、边框等所有组件)?非常感谢! - pearmak
最佳实现选择器的方法是使用XML,请参考http://www.blazin.in/2016/03/how-to-use-selectors-for-botton.html。我按照此方法实现了它,它可以正常工作。 - Bhushan Shirsath
嗨,我知道你写这篇文章已经有一段时间了,但也许你会知道我缺少什么。我使用了你的代码,我的按钮总是绿色的,当pressed=true和selected=true时,它会将drawable更改为灰色,但是在打开其他活动之前的那一秒钟,按钮具有默认的Android样式。你有什么想法,我错过了哪个状态? - volfk

33

使用状态列表可绘制对象无法实现文本大小的更改。要更改文本颜色和文本大小,请按照以下步骤执行:

文本颜色

要更改文本颜色,可以创建颜色状态列表资源。它将是一个单独的资源,位于res/color/目录中。在布局 XML 中,您必须将其设置为android:textColor属性的值。然后,颜色选择器将包含类似于以下内容的内容:

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

文字大小

你不能仅通过资源文件改变文字大小。没有“dimen选择器”可以使用。你必须在代码中完成这个操作,而且没有直接的解决方案。

可能最简单的解决方案是利用 View.onTouchListener() 并相应地处理上下事件。可以使用类似以下的方法:

view.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // change text size to the "pressed value"
                return true;
            case MotionEvent.ACTION_UP:
                // change text size to the "normal value"
                return true;
            default:
                return false;
            }
        }
});

另一种解决方案可能是扩展视图并覆盖setPressed(Boolean)方法。当按下状态发生变化时,该方法会在内部调用。然后在方法调用中相应地更改文本的大小(不要忘记调用super)。


18
在drawable文件夹中创建custom_selector.xml。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:drawable="@drawable/unselected" android:state_pressed="true" />
   <item android:drawable="@drawable/selected" />
</selector>

在drawable文件夹中创建selected.xml形状

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" android:padding="90dp">
   <solid android:color="@color/selected"/>
   <padding />
   <stroke android:color="#000" android:width="1dp"/>
   <corners android:bottomRightRadius="15dp" android:bottomLeftRadius="15dp" android:topLeftRadius="15dp" android:topRightRadius="15dp"/>
</shape>
在drawable文件夹中创建unselected.xml形状。
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" android:padding="90dp">
   <solid android:color="@color/unselected"/>
   <padding />
   <stroke android:color="#000" android:width="1dp"/>
   <corners android:bottomRightRadius="15dp" android:bottomLeftRadius="15dp" android:topLeftRadius="15dp" android:topRightRadius="15dp"/>
</shape>
在values文件夹的color.xml中为选中/未选中状态添加以下颜色
<color name="selected">#a8cf45</color>
<color name="unselected">#ff8cae3b</color>

您可以从这里检查完整的解决方案。


3
您可以使用以下代码:
<Button
    android:id="@+id/img_sublist_carat"
    android:layout_width="70dp"
    android:layout_height="68dp"
    android:layout_centerVertical="true"
    android:layout_marginLeft="625dp"
    android:contentDescription=""
    android:background="@drawable/img_sublist_carat_selector"
    android:visibility="visible" />

(选择器文件) img_sublist_carat_selector.xml:
<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:state_focused="true" 
       android:state_pressed="true"        
       android:drawable="@drawable/img_sublist_carat_highlight" />
 <item android:state_pressed="true" 
       android:drawable="@drawable/img_sublist_carat_highlight" />
 <item android:drawable="@drawable/img_sublist_carat_normal" />
</selector>

2
在布局 .xml 文件中:
<Button
 android:id="@+id/button1"
 android:background="@drawable/btn_selector"
 android:layout_width="100dp"
 android:layout_height="50dp"
 android:text="press" />

btn_selector.xml

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

 <item android:drawable="@drawable/btn_bg_selected" android:state_selected="true"></item>
<item android:drawable="@drawable/btn_bg_pressed" android:state_pressed="true"></item>
<item android:drawable="@drawable/btn_bg_normal"></item>


2

实现选择器的最佳方法是使用 XML 而不是编程方式,因为使用 XML 更容易实现。

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

    </selector>

想要了解更多信息,可以通过以下链接查看实现方式:http://www.blazin.in/2016/03/how-to-use-selectors-for-botton.html


链接已经失效。 - undefined

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