Java 当按下菜单按钮时,如何创建单击事件和双击事件?

Java 当按下菜单按钮时,如何创建单击事件和双击事件?,java,android,click,double,double-click,Java,Android,Click,Double,Double Click,我想能够检测到一个单一的点击或双击时,菜单按钮被按下。如果检测到一次单击,甚至会发生一次,如果检测到双击,则会发生另一次事件。以下是我尝试过的(使用toast代替事件): private static final long DOUBLE\u PRESS\u INTERVAL=250;//以毫为单位 私人长时间; @凌驾 公共布尔值OnPrepareOptions菜单(菜单){ //以纳秒为单位获取当前时间。 长按时间=System.currentTimeMillis(); //如果双击。。。 i

我想能够检测到一个单一的点击或双击时,菜单按钮被按下。如果检测到一次单击,甚至会发生一次,如果检测到双击,则会发生另一次事件。以下是我尝试过的(使用toast代替事件):

private static final long DOUBLE\u PRESS\u INTERVAL=250;//以毫为单位
私人长时间;
@凌驾
公共布尔值OnPrepareOptions菜单(菜单){
//以纳秒为单位获取当前时间。
长按时间=System.currentTimeMillis();
//如果双击。。。

if(pressTime-lastPressTime简单的逻辑错误。您在录制新的lastPressTime之前返回。如果他们都返回相同的内容,您应该只有一个回叫:

boolean mHasDoubleClicked = false;

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {    

        // Get current time in nano seconds.
        long pressTime = System.currentTimeMillis();


        // If double click...
        if (pressTime - lastPressTime <= DOUBLE_PRESS_INTERVAL) {
            Toast.makeText(getApplicationContext(), "Double Click Event", Toast.LENGTH_SHORT).show();
            mHasDoubleClicked = true;
        }
        else {     // If not double click....
            mHasDoubleClicked = false;
            Handler myHandler = new Handler() {
                 public void handleMessage(Message m) {
                      if (!mHasDoubleClicked) {
                            Toast.makeText(getApplicationContext(), "Single Click Event", Toast.LENGTH_SHORT).show();
                      }
                 }
            };
            Message m = new Message();
            myHandler.sendMessageDelayed(m,DOUBLE_PRESS_INTERVAL);
        }
        // record the last time the menu button was pressed.
        lastPressTime = pressTime;      
        return true;
    }
boolean mHasDoubleClicked=false;
@凌驾
公共布尔值OnPrepareOptions菜单(菜单){
//以纳秒为单位获取当前时间。
长按时间=System.currentTimeMillis();
//如果双击。。。

if(pressTime-lastPressTime我修改了此代码以检测保持事件(长点击)以及短点击和双击。其工作原理是将短点击的检测延迟到尚未处理事件的操作启动事件(clickHandled==false)

为onShortClick()、onLongClick()和onDoubleClick()提供您自己的方法

private长时间;
private long previousTouchTime=0;
私密长钮扣时间;
私有布尔clickHandled=false;
私有长双击间隔=ViewConfiguration.getDoubleTapTimeout();
private long_HOLD_TIMEOUT=ViewConfiguration.getLongPressTimeout();
@凌驾
公共布尔onTouch(视图v,最终运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
thisTouchTime=System.currentTimeMillis();
if(thisTouchTime-上一次TouchTime长时间\u保持\u超时){
clickHandled=true;
onLongClick(事件);
}否则{
Handler myHandler=newhandler(){
公共无效handleMessage(消息m){
如果(!ClickHandle){
clickHandled=true;
onShortClick(事件);
}
}
};
消息m=新消息();
sendMessageDelayed(m,双击间隔);
}
}
打破
case MotionEvent.ACTION\u移动:
myParams.x=initialDrawX+(int)(event.getRawX()-initialTouchX);
myParams.y=initialDrawY+(int)(event.getRawY()-initialTouchY);
windowManager.UpdateView布局(v,myParams);
打破
}
返回false;
}

这不会解决问题,因为在双击中第一次按下按钮时,您将运行“else”案例并启动单次单击事件,然后立即执行“if”案例。啊,好的,我现在知道了。查看编辑是否更好。我还没有检查它是否编译。在handleMessage decla之后缺少一个分号定量。但它工作得很好。太棒了!在谷歌搜索这个问题的答案时,我从来没有使用过handler对象,也从来没有找到任何关于它的信息。非常感谢!完美的答案。谢谢:)我是如何检测到长时间点击的?我现在正在浏览文档,但没有找到任何有效的信息?(现在长时间单击只显示键盘)我想我明白你的意思了。我希望长时间单击物理键盘,而不是视图。视图已注册长时间单击。
boolean mHasDoubleClicked = false;

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {    

        // Get current time in nano seconds.
        long pressTime = System.currentTimeMillis();


        // If double click...
        if (pressTime - lastPressTime <= DOUBLE_PRESS_INTERVAL) {
            Toast.makeText(getApplicationContext(), "Double Click Event", Toast.LENGTH_SHORT).show();
            mHasDoubleClicked = true;
        }
        else {     // If not double click....
            mHasDoubleClicked = false;
            Handler myHandler = new Handler() {
                 public void handleMessage(Message m) {
                      if (!mHasDoubleClicked) {
                            Toast.makeText(getApplicationContext(), "Single Click Event", Toast.LENGTH_SHORT).show();
                      }
                 }
            };
            Message m = new Message();
            myHandler.sendMessageDelayed(m,DOUBLE_PRESS_INTERVAL);
        }
        // record the last time the menu button was pressed.
        lastPressTime = pressTime;      
        return true;
    }
private long thisTouchTime;
private long previousTouchTime = 0;
private long buttonHeldTime;
private boolean clickHandled = false;
private long DOUBLE_CLICK_INTERVAL = ViewConfiguration.getDoubleTapTimeout();
private long LONG_HOLD_TIMEOUT = ViewConfiguration.getLongPressTimeout();

@Override
public boolean onTouch(View v, final MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            thisTouchTime = System.currentTimeMillis();
            if (thisTouchTime - previousTouchTime <= DOUBLE_CLICK_INTERVAL) {
                // double click detected
                clickHandled = true;
                onDoubleClick(event);
            } else {
                // defer event handling until later
                clickHandled = false;
            }
            previousTouchTime = thisTouchTime;
            break;
        case MotionEvent.ACTION_UP:
            if (!clickHandled) {
                buttonHeldTime = System.currentTimeMillis() - thisTouchTime;
                if (buttonHeldTime > LONG_HOLD_TIMEOUT) {
                    clickHandled = true;
                    onLongClick(event);
                } else {
                    Handler myHandler = new Handler() {
                        public void handleMessage(Message m) {
                            if (!clickHandled) {
                                clickHandled = true;
                                onShortClick(event);
                            }
                        }
                    };
                    Message m = new Message();
                    myHandler.sendMessageDelayed(m, DOUBLE_CLICK_INTERVAL);
                }
            }
            break;
        case MotionEvent.ACTION_MOVE:
            myParams.x = initialDrawX + (int) (event.getRawX() - initialTouchX);
            myParams.y = initialDrawY + (int) (event.getRawY() - initialTouchY);
            windowManager.updateViewLayout(v, myParams);
            break;
    }
    return false;
}