Когда я добавляю более одного состояния в <item> в списке состояний, он перестает работать. Зачем?

Что я хочу:

ImageView с прозрачным фоном. При щелчке его фон должен стать синим и оставаться синим до тех пор, пока не будет нажата какая-либо другая кнопка. Я использую для этого список состояний.

Что происходит:

Код дается следующим образом. Проблема в том, что фон становится синим, но не остается синим. Так что я думал, что это потому, что android:state_pressed просто представляет момент, когда виджет нажимается. Поэтому я также добавил android:state_selected="true" в button_state_list_drawable.xml сразу после android:state_pressed="true", Затем произошло то, что фон перестал светиться синим даже при нажатии на изображение.

Как это исправить?

ImageView определяется в XML следующим образом:

<ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/fragment_imageView"
        android:src="@drawable/ic_photo"
        android:background="@drawable/button_state_list_drawable"
        android:clickable="true" />

button_state_list_drawable.xml является:

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

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

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

</selector>

button_pressed_state_drawable.xml является:

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

    <size android:width="50dp"
        android:height="50dp" />

    <padding android:left="25dp"
        android:right="25dp"
        android:top="25dp"
        android:bottom="25dp" />

    <stroke android:color="#fff"
        android:width="1dp" />

    <solid android:color="#1aafd0" />

</shape>

button_enabled_state_drawable.xml является:

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

    <size android:width="50dp"
        android:height="50dp" />

    <padding android:left="25dp"
        android:right="25dp"
        android:top="25dp"
        android:bottom="25dp" />

    <stroke android:color="#fff"
        android:width="1dp" />

    <solid android:color="@android:color/transparent" />

</shape>

2 ответа

Решение

У меня недавно была эта проблема, и это то, что я сделал.

В вашем button_state_list_drawable.xml добавьте это где-нибудь перед тем, как использовать элемент состояния по умолчанию:

<item android:drawable="@drawable/button_pressed_state_drawable"
        android:state_selected="true"
        android:state_pressed="false" />

Также удалите android:state_selected="true" от твоего state_pressed вещь.

Затем в начале вашего щелчка слушатель для ImageView, записывать

yourImageView.setSelected(true);

Это решило мою проблему. Надеюсь, это поможет вам.

Я не знаю, является ли это решением, но я должен показать некоторый код. Вы не добавили состояние по умолчанию в ваш селектор, и я не могу видеть ваше выбранное состояние (вы написали это в своем вопросе, но не опубликовали его). Это должно быть что-то вроде этого:

<selector xmlns:android="http://schemas.android.com/apk/res/android" >


   <item android:drawable="@drawable/button_enabled_state_drawable"
        android:state_enabled="true" />

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

    <item android:drawable="@drawable/your_selected_state_drawable"
        android:state_selected="true" />

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

</selector>

И я думаю, что вы должны программно добавить выбранное состояние (я не уверен в этом или если он делает это автоматически)

yourImageView.setOnClickListener(new OnClickListener(){
      @Override
  public void onClick(View v){

        if(yourImageView.isSelected()){
            yourImageView.setSelected(false);
          }else{
            yourImageView.setSelected(true);
          }
    }
});
Другие вопросы по тегам