在写自定义view的时候经常会遇到需要为其添加长按事件的情况,当然,这里分几种情况,比如该自定义view如果是继承自listView或者是gridView的话,可以直接为其建立一个长按监听器:
listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemClick(AdapterView<?> parent, View view,int position, long id) {
// Do something
return true.
}
但是,如果设立长按监听之后会与短按监听冲突,这里有两种情形,第一种是如果长按监听是弹出一个dialog之类的窗口视图的话,那么此时不会再进入端按监听的形式,此时可以不用对监听冲突进行处理。当然,第二种情形就是窗口视图之外的操作,这时候可以设置一个布尔型的全局变量,因为长按时一般会先触发长按事件,然后再触发短按事件,我们在二者中分别给布尔变量赋予不用的值并在短按事件里做个判断就行了,伪代码如下:
gridView.setOnItemLongClickListener(new OnItemLongClickListener(){//设置事件监听(长按)
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
longPress=true;
//执行操作
}
}
//设置事件监听(短按)
gridView.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
If(longPress)
{
longPress=false;
break;
}
else
{
longPress=false;
//执行操作
}
}
}
可是,在实际操作中,比如公司希望你开发一个公用的自定义view,并且因为业务需求刚好需要用到长按事件的话,此时如果还是采用需要人为的设立监听器的方式,会违背了公用view的基本原则,因此比较妥当的方式是在自定义view的分发过程中对其长按操作进行判断,而长按事件的发生可以采用runnable和handler(view里有自带的handler)的形式,这是目前通用的处理方式,也是