selettore del pulsante Android


115

Questo è un selettore di pulsanti tale che quando è normale appare rosso, quando viene premuto appare grigio.

Vorrei chiedere come potrebbe essere ulteriormente modificato direttamente il codice in modo tale che, quando PREMUTO, anche la dimensione e il colore del testo potrebbero cambiare? Grazie molto!

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

Risposte:


217

Hai solo bisogno di set selectordi buttonnel file di layout.

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

e fatto.

modificare

Di seguito è riportato il button_effect.xmlfile nella drawabledirectory

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

In questo, puoi vedere che ci sono 3 drawables, devi solo inserire questo button_effectstile nel tuo button, come ho scritto sopra. Hai solo bisogno di sostituire selector_xml_namecon button_effect.


potresti per favore approfondire di più su come impostare lo stato premuto e non premuto? (con tutti i componenti sopra come colore rotondo, tratto, ecc.). Grazie molto!
Pearmak

Il modo migliore per implementare il selettore è utilizzare l'xml, fare riferimento a questo blazin.in/2016/03/how-to-use-selectors-for-botton.html che ho implementato in base a questo e al suo funzionamento
Bhushan Shirsath

Ciao, so che è passato un po 'di tempo che hai scritto questo post ma forse saprai cosa mi sto perdendo. Ho usato il tuo codice e il mio pulsante è sempre verde quindi per premuto = vero e selezionato = vero sta cambiando disegnabile in grigio ma il pulsante secod prima dell'apertura di altre attività ha lo stile Android predefinito. Qualche idea di quale stato mi sto perdendo?
volfk

27

Non è possibile modificare la dimensione del testo con un elenco di stati disegnabile . Per modificare il colore del testo e la dimensione del testo, procedere come segue:

Colore del testo

Per modificare il colore del testo, è possibile creare una risorsa dell'elenco di stati del colore . Sarà una risorsa separata situata nella res/color/directory. Nel layout xml devi impostarlo come valore per l' android:textColorattributo. Il selettore del colore conterrà quindi qualcosa del genere:

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

Dimensione del testo

Non puoi modificare la dimensione del testo semplicemente con le risorse. Non esiste un "selettore dimen". Devi farlo in codice. E non esiste una soluzione semplice.

Probabilmente la soluzione più semplice potrebbe essere quella di utilizzare View.onTouchListener()e gestire di conseguenza gli eventi su e giù. Usa qualcosa del genere:

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 soluzione diversa potrebbe essere quella di estendere la visualizzazione e sostituire il setPressed(Boolean)metodo. Il metodo viene chiamato internamente quando avviene il cambiamento dello stato premuto. Quindi modificare la dimensione del testo di conseguenza nella chiamata al metodo (non dimenticare di chiamare il super).


14

Crea custom_selector.xml nella cartella disegnabile

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

Crea la forma selected.xml nella cartella disegnabile

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

Crea una forma unselected.xml nella cartella disegnabile

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

Aggiungi i seguenti colori per lo stato selezionato / non selezionato nel file color.xml della cartella dei valori

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

puoi controllare la soluzione completa da qui


2

Il modo migliore per implementare il selettore è usare l'xml invece di usare il modo programmatico poiché è più facile da implementare 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>

Per maggiori informazioni ho implementato utilizzando questo link http://www.blazin.in/2016/03/how-to-use-selectors-for-botton.html


2

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

Puoi usare questo codice:

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

(File selettore) 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.