单击并双击android中的按钮

时间:2013-03-12 04:42:08

标签: android button onclicklistener

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

10 个答案:

答案 0 :(得分:8)

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

请参阅此代码,

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

答案 1 :(得分:4)

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

当我第一次开始在Android上编程时,我一直在运行那些在Android上真正“难以”做的事情。随着时间的推移,我发现其中许多都很难,因为它们是一个非常糟糕的主意。

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

以下是类似的问题和答案:

Android: How to detect double-tap?

答案 2 :(得分:3)

感谢 @NikolaDespotoski

您可以通过以下网址检查 DOUBLE-TAP 示例。 在listView中使用。我希望它对你有用。

https://nodeload.github.com/NikolaDespotoski/DoubleTapListView/zip/master

答案 3 :(得分:2)

您必须实施 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(context, 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);
    }

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

答案 4 :(得分:2)

虽然为时已晚,但任何人都可以知道他们是否看到了这一点。

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应用您的逻辑。并且线程将等待下一毫秒,然后将完成您的逻辑。 因此,现在您可以根据需要应用尽可能多的点击次数。

答案 5 :(得分:1)

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

MainActivity

答案 6 :(得分:1)

很简单,只需覆盖即可。

  

OnClickListener的onClick方法

public abstract class DoubleClickListener implements View.OnClickListener {
private static final long DEFAULT_QUALIFICATION_SPAN = 200;
private boolean isSingleEvent;
private long doubleClickQualificationSpanInMillis;
private long timestampLastClick;
private Handler handler;
private Runnable runnable;

public DoubleClickListener() {
    doubleClickQualificationSpanInMillis = DEFAULT_QUALIFICATION_SPAN;
    timestampLastClick = 0;
    handler = new Handler();
    runnable = new Runnable() {
        @Override
        public void run() {
            if (isSingleEvent) {
                onSingleClick();
            }
        }
    };
}

@Override
public void onClick(View v) {
    if((SystemClock.elapsedRealtime() - timestampLastClick) < doubleClickQualificationSpanInMillis) {
        isSingleEvent = false;
        handler.removeCallbacks(runnable);
        onDoubleClick();
        return;
    }

    isSingleEvent = true;
    handler.postDelayed(runnable, DEFAULT_QUALIFICATION_SPAN);
    timestampLastClick = SystemClock.elapsedRealtime();
}

public abstract void onDoubleClick();
public abstract void onSingleClick();
}

用法

 button.setOnClickListener(new DoubleClickListener() {
        @Override
        public void onDoubleClick() {
            Log.i("onClick", "double");
        }

        @Override
        public void onSingleClick() {
            Log.i("onClick", "single");
        }
    });

答案 7 :(得分:1)

这是@saksham 在 Kotlin 中的回答。

abstract class DoubleClickListener : View.OnClickListener {
    private val DEFAULT_QUALIFICATION_SPAN = 200L
    private var isSingleEvent = false
    private val doubleClickQualificationSpanInMillis =
        DEFAULT_QUALIFICATION_SPAN
    private var timestampLastClick = 0L
    private val handler = Handler(Looper.getMainLooper())
    private val runnable: () -> Unit = {
        if (isSingleEvent) {
            onSingleClick()
        }
    }
    override fun onClick(v: View) {
        if (SystemClock.elapsedRealtime() - timestampLastClick < doubleClickQualificationSpanInMillis) {
            isSingleEvent = false
            handler.removeCallbacks(runnable)
            onDoubleClick()
            return
        }
        isSingleEvent = true
        handler.postDelayed(runnable, DEFAULT_QUALIFICATION_SPAN)
        timestampLastClick = SystemClock.elapsedRealtime()
    }

    abstract fun onDoubleClick()
    abstract fun onSingleClick()
}

答案 8 :(得分:0)

up解决方案无法用于多次点击,我测试但失败了。

所以我建议使用RxBinding和ProgressDialog。

单击按钮时,progressDialog显示设置无法取消,修复它。

答案 9 :(得分:-2)

我也遇到了同样的问题

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

当我点击按钮时,FM停止;但是当我双击时,FM没有停止。问题是单击并双击按钮,isFmOn()的值是不同的。 我用这个解决了问题:

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
                }
            }
}