Изменение цвета фона кнопки и его сохранение после нажатия

У меня есть ListFragment, который содержит кнопку в каждом элементе списка. При нажатии кнопки цвет кнопки изменяется (с использованием ресурса Drawable xml). Хотя цвет кнопки изменяется во время события щелчка, ее цвет возвращается к значению по умолчанию после события, т. е. изменение цвета мгновенно наблюдается во время щелчка, а не после него. Я действительно хотел бы, чтобы изменение цвета сохранялось после срабатывания события.

Я пробовал подход к управлению представлениями элементов с помощью метода getView(int position, View convertView, ViewGroup parent) пользовательского адаптера ListFragment (в моем случае SimpleAdapter), где я мог хранить позиции элементов и сохранять фоновое состояние каждого Кнопка. Однако я хотел бы воспроизвести это решение с помощью селекторов.

У меня есть два цвета настроек ресурсов Drawable для нажатых и нажатых состояний каждой кнопки, а также ресурс селектора, который управляет этими состояниями.

Вот мой ресурс для рисования, который манипулирует состояниями цвета:

<?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/clicked_drawable" /> <!-- pressed -->
    <item android:state_focused="false" android:state_pressed="false"
          android:drawable="@drawable/clicked_drawable" />
    <item android:drawable="@drawable/unclicked_drawable" /> <!-- default -->
</selector>

И два ресурса, которые содержат разные цвета, clicked_drawable.xml и unclicked_drawable.xml, по порядку:

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

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

И файл макета для ListFragment:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="300dp"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:layout_weight="1"
    android:descendantFocusability="blocksDescendants"
    android:layout_margin="5dp" 
>

    <ListView android:id="@id/android:list"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 

    /> 

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
    >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/label" 
            android:gravity="start"

        />

        <TextView 
            android:id="@+id/text_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" 
            android:layout_weight="1"
            android:gravity="center"

        />

     </LinearLayout>

     <Button
         android:id="@+id/button_1"
         android:layout_height="wrap_content"
         android:layout_width="wrap_content"
         android:text="@string/button"
         android:layout_margin="2dp"
         android:layout_marginLeft="2dp"
         android:layout_marginRight="2dp"
         android:clickable="true"
         android:background="@drawable/selector_drawable"

      />

 </LinearLayout>

Я не могу решить эту проблему, и любое направление, руководство или решение будут высоко оценены.


person user1841702    schedule 07.06.2014    source источник
comment
вам нужно сделать это программно\   -  person Rod_Algonquin    schedule 07.06.2014
comment
Вы должны сделать это программно, например, добавить тег для своей кнопки, а для разных тегов установить фон кнопки на что-то другое.   -  person Rudi    schedule 07.06.2014
comment
если это фрагмент списка, вам нужно применить изменение цвета в методе getview вашего адаптера.   -  person Illegal Argument    schedule 07.06.2014


Ответы (2)


Добавьте следующий код в метод getView() класса Adapter:

@Override
public void getView(int position, View view, ViewGroup parent){

    final Button b = (Button) view.findViewById(R.id.button);

    b.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v){
            b.setBackgroundResource(R.drawable.clicked_drawable);

            .....
            .....

    }

....
....

}

Попробуй это. Это сработает.

person Y.S    schedule 07.06.2014
comment
Да, это было полезно. Однако следует отметить, что, поскольку ListView повторно использует свои элементы, кнопки, которые были нажаты ранее, могут потерять свое фоновое состояние при прокрутке. Но этот вопрос на самом деле не был частью вопроса. - person user1841702; 07.06.2014

<Button
     android:id="@+id/button1"
     android:background="@drawable/selector_xml_name"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="test" />

И сделайте свой селектор таким, установите все состояния на один и тот же рисуемый

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

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

</selector>
person CodeWarrior    schedule 07.06.2014