seletor de botão android

115

Este é um seletor de botão que quando normal aparece vermelho, quando pressionado aparece cinza.

Eu gostaria de perguntar como o código poderia ser modificado diretamente de forma que quando PRESSED o tamanho e a cor do texto também pudessem mudar? Muito Obrigado!

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

Respostas:

217

Você só precisa conjunto selectorde buttonno seu arquivo de layout.

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

E feito.

Editar

A seguir está o button_effect.xmlarquivo no drawablediretório

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

Nisto, você pode ver que existem 3 drawables, você só precisa colocar esse button_effectestilo no seu button, como escrevi acima. Você só precisa substituir selector_xml_namepor button_effect.

Chintan Rathod
fonte
você poderia elaborar mais sobre como definir o estado pressionado e não pressionado? (com todos os componentes acima, como cor redonda, traço, etc.). Muito Obrigado!
pearmak
A melhor maneira de implementar o seletor é usando o xml, consulte este blazin.in/2016/03/how-to-use-selectors-for-botton.html que implementei conforme isto e seu funcionamento
Bhushan Shirsath
Olá, sei que já faz um tempo que você escreveu este post, mas talvez você saiba o que estou perdendo. Usei seu código e meu botão está sempre verde, em seguida, para pressionado = verdadeiro e selecionado = verdadeiro, ele muda o drawable para cinza, mas o botão secod antes de outra atividade ser aberta tem o estilo android padrão. Alguma ideia de que estado estou perdendo?
volfk
27

Você não pode alcançar a mudança de tamanho de texto com um drawable de lista de estados . Para alterar a cor e o tamanho do texto, faça o seguinte:

Cor do texto

Para alterar a cor do texto, você pode criar um recurso de lista de estados de cores . Será um recurso separado localizado no res/color/diretório. No layout xml, você deve defini-lo como o valor do android:textColoratributo. O seletor de cores conterá algo assim:

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

Tamanho do texto

Você não pode alterar o tamanho do texto simplesmente com recursos. Não há "seletor de dimen". Você tem que fazer isso em código. E não existe uma solução simples.

Provavelmente, a solução mais fácil seria utilizar View.onTouchListener()e lidar com os eventos de ativação e desativação de acordo. Use algo assim:

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

Uma solução diferente pode ser estender a visualização e substituir o setPressed(Boolean)método. O método é chamado internamente quando ocorre a mudança do estado pressionado. Em seguida, altere o tamanho do texto de acordo na chamada do método (não se esqueça de chamar o super).

Tomik
fonte
14

Crie custom_selector.xml na pasta drawable

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

Crie a forma selected.xml na pasta drawable

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

Crie a forma unselected.xml na pasta drawable

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

Adicione as seguintes cores para o estado selecionado / não selecionado em color.xml da pasta de valores

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

você pode verificar a solução completa aqui

nirav kalola
fonte
2

A melhor maneira de implementar o seletor é usando o xml em vez de usar a forma programática, pois é mais fácil de implementar com o 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 obter mais informações, implementei usando este link http://www.blazin.in/2016/03/how-to-use-selectors-for-botton.html

Bhushan Shirsath
fonte
2

No arquivo 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
fonte
1

Você pode 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" />

(Arquivo Seletor) 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
fonte