selector de botones de android


115

Este es un selector de botón tal que cuando es normal aparece rojo, cuando se presiona aparece gris.

Me gustaría preguntar cómo podría modificarse más directamente el código de modo que cuando SE PRESIONE, el tamaño y el color del texto también puedan cambiar. ¡Muchas gracias!

<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>

Respuestas:


217

Sólo tiene que conjunto selectorde buttonen el archivo de diseño.

<Button
     android:id="@+id/button1"
     android:background="@drawable/selector_xml_name"
     android:layout_width="200dp"
     android:layout_height="126dp"
     android:text="Hello" />

y hecho.

Editar

A continuación se muestra el button_effect.xmlarchivo en el drawabledirectorio

<?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>

En esto, puede ver que hay 3 elementos de diseño, solo necesita colocar este button_effectestilo en su button, como escribí anteriormente. Solo necesita reemplazar selector_xml_namecon button_effect.


¿Podría explicar más sobre cómo configurar el estado presionado y no presionado? (con todos los componentes anteriores, como color redondo, trazo, etc.). ¡Muchas gracias!
pearmak

La mejor manera de implementar el selector es utilizando el xml, consulte este blazin.in/2016/03/how-to-use-selectors-for-botton.html que implementé según esto y su funcionamiento
Bhushan Shirsath

Hola, sé que hace un tiempo que escribiste esta publicación, pero tal vez sepas lo que me estoy perdiendo. Usé su código y mi botón es siempre verde, luego, para presionado = verdadero y seleccionado = verdadero, está cambiando el dibujo a gris, pero el segundo antes de que se abra otra actividad tiene el estilo predeterminado de Android. ¿Alguna idea de qué estado me estoy perdiendo?
volfk

27

No puede lograr un cambio de tamaño de texto con una lista de estado dibujable . Para cambiar el color y el tamaño del texto, haga lo siguiente:

Color de texto

Para cambiar el color del texto, puede crear un recurso de lista de estado de color . Será un recurso separado ubicado en el res/color/directorio. En el diseño xml, debe establecerlo como valor para el android:textColoratributo. El selector de color contendrá algo como esto:

<?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>

Tamano del texto

No puede cambiar el tamaño del texto simplemente con recursos. No hay "selector de dimensiones". Tienes que hacerlo en código. Y no existe una solución sencilla.

Probablemente, la solución más fácil podría ser utilizar View.onTouchListener()y manejar los eventos de subida y bajada en consecuencia. Usa algo como esto:

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;
            }
        }
});

Una solución diferente podría ser ampliar la vista y anular la setPressed(Boolean) método. El método se llama internamente cuando ocurre el cambio del estado presionado. Luego, cambie el tamaño del texto en consecuencia en la llamada al método (no olvide llamar al super).


14

Cree custom_selector.xml en la carpeta dibujable

<?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>

Crear forma selected.xml en carpeta dibujable

<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>

Cree una forma .xml no seleccionada en una carpeta dibujable

<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>

Agregue los siguientes colores para el estado seleccionado / no seleccionado en color.xml de la carpeta de valores

<color name="selected">#a8cf45</color>
<color name="unselected">#ff8cae3b</color>

puedes consultar la solución completa desde aquí


2

La mejor manera de implementar el selector es usando el xml en lugar de usar la forma programática, ya que es más fácil de implementar con 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>

Para obtener más información, implementé usando este enlace http://www.blazin.in/2016/03/how-to-use-selectors-for-botton.html


2

En el archivo Layout .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>


1

Puedes usar este código:

<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" />

(Archivo selector) 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>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.