2013-03-12 88 views
1

在我的应用程序中,我有一个按钮。单击和双击按钮后将执行单独的操作。我怎样才能做到这一点?谢谢单击并双击android中的一个按钮

+1

只需设置一个全局变量计数并在点击事件中增加。当count = 2时,执行双击操作并重置为count = 0。 – Hemant 2013-03-12 04:49:03

回答

7

您可能需要创建一个延迟变量,它将在单击和双击之间进行区分。

看到这个代码,

private static final long DOUBLE_PRESS_INTERVAL = 250; // in millis 
private long lastPressTime; 

private 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; 
    } 
+0

嗨,感谢您的回复。实际上,我需要知道如何将它应用于按钮中,因为我在android – andDev 2013-03-12 04:51:50

+0

@ Rynold中使用了新的代码,当我双击时,单击单击内的代码也会执行。你可以帮帮我吗。 – Manikandan 2014-01-21 17:09:26

+0

为什么你使用处理器类@Raynold – Xplosive 2015-01-18 19:06:57

1

您必须实现GestureDetector,把你的代码single/double click

TestActivity.java

iv.setOnClickListener(new OnClickListener() {   
       @Override 
       public void onClick(View v) { 
        //putyour first activity call. 
       } 
    } 

iv.setOnTouchListener(new OnTouchListener() { 
      GestureDetector gestureDetector = new GestureDetector(new MyGestureDetector(context)); 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
       return gestureDetector.onTouchEvent(event); 
     } 
}); 

现在,你必须创建GestureDetector.java类。

public class MyGestureDetector extends SimpleOnGestureListener { 
public Context context; 
public String phno; 

public MyGestureDetector(Context con) 
{ 
    this.context=con;  
} 
@Override 
public boolean onDown(MotionEvent e) { 
    return super.onDown(e); 
} 
public MyGestureDetector(Context con) { 
    this.context=con; 
} 
@Override 
public boolean onDoubleTap(MotionEvent e) { 
    System.out.println("in Double tap"); 

    return true; 
} 
@Override 
public boolean onSingleTapUp(MotionEvent e) { 
    System.out.println("in single tap up"); 
      //put your second activity. 
    return super.onSingleTapUp(e); 
} 
} 
+0

嗨谢谢reply.by这段代码,当我尝试执行双触摸操作时,它也执行单点触摸操作。双击时如何停止单触操作? – andDev 2013-03-12 05:25:59

+0

@andDev你必须单击/双击需要相同的函数调用,所以有什么问题? – Harshid 2013-03-12 05:28:25

+0

实际上我需要使用两种活动进行单人和双人触摸 – andDev 2013-03-12 05:44:08

3

您可能要考虑不使用DoubleTap。这不是一个正常的Android行为。

当我第一次在Android上开始编程时,我一直在遇到在android上真的很“难”的事情。随着时间的推移,我发现其中很多都很困难,因为这是一个非常糟糕的主意。

如果您正在移植iOS应用程序或模拟iOS应用程序的行为,则可能需要考虑将UI转换为Android样式行为并使用longPress或其他“androidy”手势。

这里有一个类似的问题和答案:

Android: How to detect double-tap?

-1

我也得到了同样的问题,一旦

setOnClickListener(new OnClickListener() {   
      @Override 
      public void onClick(View v) { 
       if(isFmOn()){ 
        //stopFM 
       }else{ 
        //do other things 
       } 
      } 
} 

当我点击按钮,FM停止,但我双击时,FM没stop.The的问题是,单双点击该按钮,isFmOn()的值是不同的。 我sloved使用这个问题:

setOnClickListener(new OnClickListener() {   
      @Override 
      public void onClick(View v) { 
       Thread.sleep(500);//500ms was enough to finish stopFM before the second click 
       if(isFmOn()){ 
        //stopFM 
       }else{ 
        //do other things 
       } 
      } 
} 
+0

Ugg,在UI线程中睡觉并不是一件好事!我也不回答OP的问题。 – 2013-05-15 08:28:08

+0

单击和双击按钮后会执行单独的操作,可能问题出在onClick()函数中,有时当您释放音频资源时,必须等到释放操作完成。也许解决问题的更好的方法是简单地设置一个全局变量计数和点击增量。 – chadm 2013-05-17 00:50:06

1

虽然为时已晚,但任何人都可以计算出,如果他们看到这一点。

int number_of_clicks = 0; 
boolean thread_started = false; 
final int DELAY_BETWEEN_CLICKS_IN_MILLISECONDS = 250; 

button.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     ++number_of_clicks; 
     if(!thread_started){ 
      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        thread_started = true; 
        try { 
         Thread.sleep(DELAY_BETWEEN_CLICKS_IN_MILLISECONDS); 
         if(number_of_clicks == 1){ 
          client.send(AppHelper.FORMAT_LEFT_CLICK); 
         } else if(number_of_clicks == 2){ 
          client.send(AppHelper.FORMAT_DOUBLE_CLICK); 
         } 
         number_of_clicks = 0; 
         thread_started = false; 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      }).start(); 
     } 
    } 
}); 

说明:


单击按钮之前,number_of_click被初始化为0。 thread_started是一个检测线程是否在之前启动的标志。 现在,点击按钮,增加按钮点击次数增量运算符。 检查线程是否先前已启动,如果没有,则启动线程。线程上的 ,使用number_of_clicks应用您的逻辑。线程将等待下一个毫秒,然后将通过你的逻辑。 因此,现在您可以根据需要应用尽可能多的点击次数。

1

通过从View.OnClickListener继承并检查点击时间来区分单击或双击来解决此问题,这也解决了快速点击的问题。此解决方案将带来轻微的代码更改,只需替换View.OnClickLister即可。您也可以覆盖getGap()重新定义两次点击之间的时间。

import android.os.SystemClock; 
import android.view.View; 

/***** 
* Implement to fix the double click problem. 
* Avoid the fast double click for button and images. 
*/ 
public abstract class OnSingleClickListener implements View.OnClickListener { 
    private long prevClickTime =0; 

    @Override 
    public void onClick(View v) { 
     _onClick(v); 
    } 

    private synchronized void _onClick(View v){ 
     long current = SystemClock.elapsedRealtime(); 
     if(current-prevClickTime> getGap()){ 
      onSingleClick(v); 
      prevClickTime = SystemClock.elapsedRealtime(); 
     }else { 
      onDoubleClick(v); 
      prevClickTime = 0; 
     } 
    } 

    public abstract void onSingleClick(View v); 
    public abstract void onDoubleClick(View v); 

    /******** 
    * 
    * @return The time in ms between two clicks. 
    */ 
    public long getGap(){ 
     return 500L; //500ms 
    } 
} 
0

解决方案不能用于多点击,我测试但失败。

所以我建议使用RxBinding和ProgressDialog。

当点击按钮时,progressDialog显示设置它不能被取消,修复它。