【问题标题】:Implement double click for button in Android在Android中实现双击按钮
【发布时间】:2011-06-18 11:01:34
【问题描述】:

如何在 Android 中实现双击按钮? 我应该使用 OnDoubleTapListener 吗?

【问题讨论】:

标签: android user-interface double-click


【解决方案1】:

这可能是一个不错的起点:

Android: How to detect double-tap?

我建议切换到更原生的方式,如长按(回答链接的问题)或更有创意的方式(使用多点触控),除非你习惯于 Windows 默认的双击操作方式?

你可能有一个正当的理由——双击毕竟比长按快。

【讨论】:

    【解决方案2】:
    int i = 0;
    btn.setOnClickListener(new OnClickListener() {
    
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            i++;
            Handler handler = new Handler();
            Runnable r = new Runnable() {
    
                @Override
                public void run() {
                    i = 0;
                }
            };
    
            if (i == 1) {
                //Single click
                handler.postDelayed(r, 250);
            } else if (i == 2) {
                //Double click
                i = 0;
                ShowDailog();
            }
    
    
        }
    });
    

    【讨论】:

    • 这不考虑任何timing constraints
    • @ParagChauhan 请看看这个question
    • 请为那些有强迫症的人修复这个帖子
    • 此代码也为双击执行单击事件。
    • ' 不错,非常便携 :) 谢谢
    【解决方案3】:

    我写这个是为了在映射应用程序中双击弹出 Toast 消息:

    private long lastTouchTime = -1;
    
    @Override
    public boolean onTouchEvent(MotionEvent e, MapView mapView) {
    
       GeoPoint p = null;
    
       if (e.getAction() == MotionEvent.ACTION_DOWN) {
    
          long thisTime = System.currentTimeMillis();
          if (thisTime - lastTouchTime < 250) {
    
             // Double click
             p = mapView.getProjection().fromPixels((int) e.getX(), (int) e.getY());
             lastTouchTime = -1;
    
          } else {
             // too slow
             lastTouchTime = thisTime;
          }
       }
       if (p != null) {
          showClickedLocation(p);// Raise a Toast
       }
       return false;
    }
    

    【讨论】:

      【解决方案4】:

      这是一个执行双击的好网站... 我使用它并工作。

      http://mobile.tutsplus.com/tutorials/android/android-gesture/

      【讨论】:

        【解决方案5】:
        private long lastTouchTime = 0;
        private long currentTouchTime = 0;
        

        ..

                 @Override
                        public void onClick(View view) {
        
                            lastTouchTime = currentTouchTime;
                            currentTouchTime = System.currentTimeMillis();
        
                            if (currentTouchTime - lastTouchTime < 250) {
                                Log.d("Duble","Click");
                                lastTouchTime = 0;
                                currentTouchTime = 0;
                            }
        
                        }
        

        【讨论】:

          【解决方案6】:

          我用过并且工作过:

          public class DoubleClickTest extends Activity {
              String TAG = "DoubleOrSingleClickTest";
              private boolean waitDouble = true;
              private static final int DOUBLE_CLICK_TIME = 350; // double click timer
          
              @Override
              public void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.double_click_test);
                  Button button = (Button) findViewById(R.id.buttonDoubleOrSingleClicked);
                  button.setOnClickListener(listenerDoubleOrSingle);
              }
          
              View.OnClickListener listenerDoubleOrSingle = new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      if (waitDouble == true) {
                          waitDouble = false;
                          Thread thread = new Thread() {
                              @Override
                              public void run() {
                                  try {
                                      sleep(DOUBLE_CLICK_TIME);
                                      if (waitDouble == false) {
                                          waitDouble = true;
                                          singleClick();
                                      }
                                  } catch (InterruptedException e) {
                                      e.printStackTrace();
                                  }
                              }
                          };
                          thread.start();
                      } else {
                          waitDouble = true;
                          doubleClick();
                      }
                  }
              };
              // single event
              private void singleClick() {
                  Log.i(TAG, "singleClick");
              }
              // double event
              private void doubleClick() {
                  Log.i(TAG, "doubleClick");
              }
          }
          

          来自“https://elingwange.iteye.com/blog/1613177

          【讨论】:

            【解决方案7】:

            创建您自己的 DoubleTapListener

            您可以通过继承 View.OnClickListener 并添加您的侦听器的 Callback 来创建 DoubleTapListener。

            MyDoubleClickListener.class

            public class MyDoubleClickListener implements View.OnClickListener{
            
                private boolean isRunning= false;
                private int resetInTime =500;
                private int counter=0;
            
                private DoubleClickCallback listener;
            
                public DoubleTapListener(Context context)
                {
                  listener = (DoubleClickCallback)context;             
                }
            
                @Override
                public void onClick(View v) {
            
                   if(isRunning)
                   {
                      if(counter==1) //<-- makes sure that the callback is triggered on double click
                      listener.onDoubleClick(v);
                   }
            
                   counter++;
            
                   if(!isRunning)
                   {
                      isRunning=true;
                      new Thread(new Runnable() {
                          @Override
                          public void run() {
                             try {
                                Thread.sleep(resetInTime);
                                isRunning = false;
                                counter=0;
                             } catch (InterruptedException e) {
                              e.printStackTrace();
                             }
                          }
                      }).start();
                   }
            
                }
            
            }
            

            DoubleClickCallback.class

            public interface DoubleClickCallback {
            
               public void onDoubleClick(View v);
            
            }
            

            你就完成了。您可以在任何 Activity 中使用此 Listener。

            如何在我的 Activity 中使用此 DoubleClickListener?

            在您的活动中实现回调并覆盖该方法。

            public class MainActivity extends AppCompatActivity implements MyDoubleClickListener{
            
                private Button button;       
            
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                     super.onCreate(savedInstanceState);
                     setContentView(R.layout.activity_main);
            
                     button   = (Button)findViewById(R.id.button);    
                     button.setOnClickListener(new DoubleTapListener(this));  //<-- Set listener
            
                }
            
                @Override
                public void onDoubleClick(View v) {
                      // Toast to show double click        
                }
            
            }
            

            重要的一点是使用这个概念你可以创建任何类型的监听器(三击监听器)

            相关链接:

            查看完整的工作代码HERE

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-04-24
              • 2014-01-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-09-07
              • 1970-01-01
              相关资源
              最近更新 更多