给listview里面的button设置selector后,当给listview设置listview.setOnitemClickedListener()的时候,里面的button会有press的效果,有两个方案
1:放弃listview的onItemClickedListener()
listview.setOnItemClickedListener(null);
2:使用自定义的Button,判断他的父控件是否press,如果是就把这个事件消耗掉,不向下传递即可,
可用代码如下:
package
com.audiocn.kalaok.widget;
import
android.content.Context;
import
android.util.AttributeSet;
import
android.view.View;
import
android.widget.Button;
public
class
FixedListButton
extends
Button {
public
FixedListButton(Context context) {
super
(context);
}
public
FixedListButton(Context context, AttributeSet attrs) {
super
(context, attrs);
}
public
FixedListButton(Context context, AttributeSet attrs,
int
defStyle) {
super
(context, attrs, defStyle);
}
@Override
public
void
setPressed(
boolean
pressed) {
if
(pressed && getParent()
instanceof
View
&& ((View) getParent()).isPressed()) {
return
;
}
super
.setPressed(pressed);
}
}
还有一种方法,个人觉得不太好。http://poolo.iteye.com/blog/1224144
26 ListView中放置button
首先如果想要ListView 里面的button被点击,且listView也能被点击。 如果直接添加的话 只能点击到button而不能点击到ListView,因为焦点被button获取了。 一、那么需要:让button不要成为焦点:
唯一的办法是在listView的填充布局文件[lis_Item.xml]中对根节点 设置 android:descendantFocusability="blocksDescendants" 然后 再让button无法获得焦点 如果button获得焦点则 无法传到listView <button android:focusable="false"> 设置完上面2个 此时的button 和listView 都能被点击,且监听都能触发。
二、坑爹的事情也来了, 如果你点击button也就罢了,但是如果你点击到listView 系统会认为你点击到了listview的顶级view 也就是button的父节点。此时 会认为 此listView的单元view[也就是那个填充的根节点]内的所有子节点都被选中。既点击listView 时填充的button也会被点击。这是不允许的。
思前想后解决办法有2个: 1.让重写ListView让ListView被点击时不要把点击事件传到填充view的下一层,只让顶层的节点接到。 2.舍弃listView监听,把填充view做成一个背景为整个view大小的button[我称它为背景button],上面再放置其他button[或者其他,此处一般使用相对布局],那么只需要把之前写给listView的监听写给那个背景button就可以了。
代码如下: 可以参照HDEasyCall项目看
2011-10-31 poolo |