Android – пользовательская кнопка (с использованием файла селектора) не работает

Я пытаюсь создать кнопку «Добавить в избранное».

Проблема в том, что рисуемый объект не меняется, пока я не нажимаю кнопку. Как только я отпускаю кнопку, она возвращается к исходному рисунку.

Я следовал этому уроку: https://thewikihow.com/video_Nn4-Vn7qk9k но получил другой результат.

Я создал файл res/drawable/custom_fav_button.xml.

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

    <item android:state_pressed = "true"
        android:drawable = "@drawable/ic_baseline_favorite_24"/>

    <item
        android:drawable = "@drawable/ic_baseline_favorite_border_24"/>

</selector>

и я использую его в действии, как показано ниже.

<Button
    android:layout_width = "200dp"
    android:layout_height = "200dp"
    android:background = "@drawable/custom_fav_button"/>

Заранее спасибо!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 723
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как вы можете видеть на видео, ваш код работает нормально и делает то, что вы говорите. Меняйте только пока нажимаете. Если вы хотите изменить его после щелчка, вы должны добавить в свой нарисованный xml

drawable_button_selector.xml

 <?xml version = "1.0" encoding = "utf-8"?>
<selector xmlns:android = "http://schemas.android.com/apk/res/android">
    <item android:drawable = "@drawable/drawable_button_selected" android:state_selected = "true" />
    <item android:drawable = "@drawable/drawable_button_unselected" android:state_selected = "false" />
    <item android:drawable = "@drawable/drawable_button_unselected" />
</selector>

drawable_button_selected.xml

<?xml version = "1.0" encoding = "utf-8"?>
<shape xmlns:android = "http://schemas.android.com/apk/res/android"
    android:shape = "rectangle">
    
    <!-- color of the selected button -->
    <solid
        android:color = "@color/purple_200"/>

</shape

drawable_button_unselected.xml

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


    <!-- unselected button background -->
    <solid
        android:color = "@color/gray_dove_three" />

    <stroke
        android:color = "@color/gray_martini"
        android:width = "2dp"/>


</shape>

В вашем макете экрана у вас есть

 <androidx.appcompat.widget.AppCompatButton
        android:id = "@+id/button"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:text = "Click Me"
        android:clickable = "true"
        android:background = "@drawable/drawable_button_selector"
        app:layout_constraintBottom_toBottomOf = "parent"
        app:layout_constraintLeft_toLeftOf = "parent"
        app:layout_constraintRight_toRightOf = "parent"
        app:layout_constraintTop_toTopOf = "parent" />

После этого, конечно, вы должны изменить состояние кнопки в зависимости от ваших требований. Например, просто переключайте состояние кнопки при нажатии

 private fun initLayout() {
        button.setOnClickListener {
            it.isSelected = !it.isSelected
            Log.d("Click Me", "Button isSelected" + it.isSelected)
            Toast.makeText(this, "Button Clicked and isSelected = " + it.isSelected, Toast.LENGTH_SHORT).show()

        }

Это сработает только один раз, когда кнопка включена. После этого кнопка не будет работать, потому что она не активирована. Я бы хотел, чтобы изображение менялось каждый раз, когда на него нажимают. Аналогично кнопке «Мне нравится» в Facebook или Instagram.

Maryam Wael 14.12.2020 10:30

@Maryam Wael Пожалуйста, проверьте мой обновленный ответ. Если вы попробуете код, вы увидите, что он отлично работает и сделает то, что вы хотите. Цвета выбраны случайным образом, и я добавляю всплывающее сообщение, чтобы убедиться, что это действительно работает.

ziselos 14.12.2020 19:48

Работает отлично. Спасибо!

Maryam Wael 14.12.2020 21:24
AppCompatButton сделал свое дело для меня. Я использовал Button вместо этого.
Azizjon Kholmatov 06.10.2022 12:23

Другие вопросы по теме