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>

pearmak
fuente

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.

Chintan Rathod
fuente
¿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).

Tomik
fuente
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í

nirav kalola
fuente
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

Bhushan Shirsath
fuente
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>

Vishal G. Gohel
fuente
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>
Bhaskar Kumar Singh
fuente