селектор кнопок android

115

Это кнопочный селектор, такой, что в нормальном состоянии он отображается красным, при нажатии - серым.

Я хотел бы спросить, как можно было бы напрямую изменить код, чтобы при НАЖАТИИ размер и цвет текста также могли измениться? Большое спасибо!

<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
источник

Ответы:

217

Вам просто нужно установить selectorиз buttonв файле макета.

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

и готово.

редактировать

Ниже приведен button_effect.xmlфайл в drawableкаталоге

<?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 чертежа, вам просто нужно поместить этот button_effectстиль в свой button, как я писал выше. Вам просто нужно заменить selector_xml_nameна button_effect.

Чинтан Ратод
источник
не могли бы вы подробнее рассказать о том, как установить нажатое и не нажатое состояние? (со всеми вышеперечисленными компонентами, такими как круглый цвет, обводка и т. д.). Большое спасибо!
pearmak
Лучший способ реализовать селектор - использовать xml, см. Этот blazin.in/2016/03/how-to-use-selectors-for-botton.html, который я реализовал в соответствии с этим и его работой
Бхушан Ширсат,
Привет, я знаю, что вы давно писали этот пост, но, возможно, вы узнаете, что мне не хватает. Я использовал ваш код, и моя кнопка всегда зеленая, а затем для нажатых = true и selected = true она меняет свой цвет на серый, но вторая кнопка перед открытием другого действия имеет стиль Android по умолчанию. Есть идеи, в каком состоянии мне не хватает?
Вольфк
27

Вы не можете добиться изменения размера текста с помощью вытягиваемого списка состояний . Чтобы изменить цвет и размер текста, сделайте следующее:

Цвет текста

Чтобы изменить цвет текста, вы можете создать ресурс списка состояний цвета . Это будет отдельный ресурс, расположенный в 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>

Размер текста

Вы не можете изменить размер текста просто с помощью ресурсов. Нет никакого "селектора размера". Вы должны сделать это в коде. И нет однозначного решения.

Вероятно, самым простым решением могло бы быть использование 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).

Томик
источник
14

Создайте 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>

Создать форму 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>

Создать форму 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>

Добавьте следующие цвета для выбранного / невыделенного состояния в папке color.xml значений

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

вы можете проверить полное решение здесь

Нирав Калола
источник
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

Бхушан Ширсат
источник
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>

Вишал Г. Гохель
источник
1

Вы можете использовать этот код:

<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>
Бхаскар Кумар Сингх
источник