我有一个ListFragment,每个列表项中都包含一个Button。单击Button时,Button的颜色会发生变化(使用Drawable xml资源)。虽然按钮的颜色在点击事件期间会发生变化,但是在事件发生后它的颜色会变回其默认值,即在点击过程中暂时可以观察到颜色变化,而不是之后。我真正喜欢的是在事件发生后颜色变化持续存在。
我尝试过一种方法来通过ListFragment的自定义适配器(在我的情况下是一个SimpleAdapter)的getView(int position,View convertView,ViewGroup parent)方法来操作项目视图,在那里我可以存储项目的位置并坚持每个Button的背景状态。但是,我想使用选择器复制此解决方案。
我有两个Drawable资源设置每个Button的按下和点击状态的颜色以及管理这些状态的选择器资源。
这是我操作颜色状态的可绘制资源:
<?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&amp; 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>
我无法解决这个问题,任何方向,指导或解决方案都会受到最高的赞赏。
答案 0 :(得分:4)
将以下代码添加到Adapter
班级getView()
方法:
@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);
.....
.....
}
....
....
}
试试这个。它会起作用。
答案 1 :(得分:0)
<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>