Изменить изображение кнопки переключения при нажатии

Я знаю, что его уже спросили и ответили здесь и здесь. Я пробовал оба, но ни один из них мне не подходит.

У меня есть любимая кнопка. Если она нажата, я устанавливаю элемент в избранное в database и заменяю изображение toggle button, и наоборот. Вот как я это делаю:

<ToggleButton
   android:id="@+id/btnFavorite"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:textOn=""
   android:textOff=""
   android:layout_marginRight="5dp"
   android:background="@drawable/favorite_btn_style" />

Вот мой favorite_btn_style.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/favourit_blue_btn" android:state_checked="true"/>
 <!-- pressed -->

    <item android:drawable="@drawable/favourit_dark_btn"/>
 <!-- default/unchecked -->

</selector>

В oncreate я проверяю, установлен ли элемент уже в избранное, затем с setchecked на true:

if (movieObj.getIsFav().intValue() == 1) {
            btnFav.setChecked(true);
        }

Вот моя onclicklistener на кнопке:

btnFav.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                if (!btnFav.isChecked()) {
                    btnFav.setChecked(true);
                    // set favorite
                    dbHelper.updateMovieFavorite(movieObj.getId().intValue(), 1);
                } else {
                    btnFav.setChecked(false);
                    // set favorite
                    dbHelper.updateMovieFavorite(movieObj.getId().intValue(), 0);
                }
            }
        });

Функция вызывается и выполняется нормально, но изображение не меняется .. Что я делаю не так?


person faizanjehangir    schedule 22.05.2014    source источник


Ответы (3)


Удалите как btnFav.setChecked(true), так и btnFav.setChecked(false) в методе OnClick. Это кнопка-переключатель, которая самостоятельно переключает setChecked при каждом щелчке, и вы сбрасываете его на старое значение. Поэтому в вашем случае оно всегда имеет одно и то же значение (начальное значение).
Я бы посоветовал вам использовать setOnCheckedChangeListener вместо onClickListener.

person Stephan    schedule 22.05.2014

Создайте файл button_toggle.xml в папке res / drawable.

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_checked="false"
        android:drawable="@drawable/ic_slide_switch_off" />
    <item
        android:state_checked="true"
        android:drawable="@drawable/ic_slide_switch_on" />
</selector>
person Ehtesham    schedule 22.05.2014

Попробуйте использовать комбинацию android: button = "@ drawable / favour_btn_style" и android: background = "@ android: color / transparent". Для настройки флажка, переключателя и переключателя вы должны использовать android: button вместо android: background.

person Rajkumar Nagarajan    schedule 22.05.2014