Реализуйте двойной щелчок по кнопке в Android - PullRequest
15 голосов
/ 31 января 2011

Как я могу реализовать двойной щелчок для кнопки в Android?Должен ли я использовать OnDoubleTapListener?

Ответы [ 7 ]

29 голосов
/ 31 января 2011
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();
        }


    }
});
4 голосов
/ 31 января 2011

Вероятно, это хорошее место для начала:

Android: как обнаружить двойной тап?

Я рекомендую перейти к более естественному способу, например, долгому нажатию (ответ на связанный вопрос) или к чему-то более творческому (с использованием мультитач), если только вы не склонны использовать способ двойного щелчка Windows по умолчанию?

Возможно, у вас есть веская причина - двойной щелчок означает , в конце концов, быстрее, чем длительное нажатие.

3 голосов
/ 01 февраля 2011

Это хороший сайт для выполнения двойного клика ... Я использовал его и работал.

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

3 голосов
/ 31 января 2011

Я написал это для всплывающего сообщения 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;
}
1 голос
/ 13 июня 2017
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;
                    }

                }
0 голосов
/ 30 января 2019

Создайте свой собственный DoubleTapListener

Вы можете создать DoubleTapListener, унаследовав View.OnClickListener и добавив Callback вашего слушателя.

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);

}

И все готово. Вы можете использовать этот слушатель в любой деятельности.

Как использовать этот 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        
    }

}

Важным моментом является то, что при использовании этой концепции вы можете создать любой тип слушателя (слушатель с тройным щелчком мыши)

Соответствующие ссылки:

См. Полный рабочий код ЗДЕСЬ

0 голосов
/ 06 января 2019

Я использовал это и работал:

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"

...