简体   繁体   English

在textview上应用双击不起作用

[英]Apply double tap on textview is not working

I want to trigger certain events on double tap of TextView. 我想在双击TextView时触发某些事件。

final GestureDetector gestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener() {
    public boolean onDoubleTap(MotionEvent e) {
        Log.e("", "Open new activty here");
        return true;
    }
});
TextView tv = (TextView) findViewById(R.id.editTextID);
tv.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }
});

This returns the ontapevent 这将返回ontapevent

You may need to create new Class implements Onclick. 您可能需要创建新的Class实现Onclick。 Normal click will be delay as 400 ms until the second click is detected by using Timer. 正常点击将延迟400毫秒,直到使用Timer检测到第二次点击为止。 If no second click after 400 ms is not exist, it will consider One Tap 如果不存在400毫秒后的第二次单击,它将考虑“一键式”

public abstract class DoubleClickListener implements OnClickListener {

    private Timer timer = null;  //at class level;
    private int DELAY   = 400;

    private static final long DOUBLE_CLICK_TIME_DELTA = 300;//milliseconds

    long lastClickTime = 0;

    @Override
    public void onClick(View v) {
        long clickTime = System.currentTimeMillis();
        if (clickTime - lastClickTime < DOUBLE_CLICK_TIME_DELTA){
            processDoubleClickEvent(v);
        } else {
            processSingleClickEvent(v);
        }
        lastClickTime = clickTime;
    }



    public void processSingleClickEvent(final View v){

       final Handler handler=new Handler();
       final Runnable mRunnable=new Runnable(){
            public void run(){
                onSingleClick(v); //Do what ever u want on single click
            }
       };

       TimerTask timertask=new TimerTask(){
            @Override
            public void run(){
                    handler.post(mRunnable);
            }
       };
       timer=new Timer();
       timer.schedule(timertask,DELAY);
    }


    public void processDoubleClickEvent(View v){
        if(timer!=null)
        {
             timer.cancel(); //Cancels Running Tasks or Waiting Tasks.
             timer.purge();  //Frees Memory by erasing cancelled Tasks.
        }

        onDoubleClick(v);//Do what ever u want on Double Click
    }

    public abstract void onSingleClick(View v);

    public abstract void onDoubleClick(View v);
}

How to use 如何使用

view.setOnClickListener(new DoubleClickListener() {

            @Override
            public void onSingleClick(View v) {

            }

            @Override
            public void onDoubleClick(View v) {
                 // Your code here
            }
        });

one of the lazy implementation 懒惰的实现之一

private static final long DOUBLE_CLICK_TIME_DELTA = 300;//milliseconds

long lastClickTime = 0;

TextView tv = (TextView) findViewById(R.id.editTextID);
tv.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        long clickTime = System.currentTimeMillis();
    if (clickTime - lastClickTime < DOUBLE_CLICK_TIME_DELTA){
        lastClickTime = 0;
        //double click
    } else {
        //single click
    }
    lastClickTime = clickTime;
    }
});

but dont be lazy if using double click again and again. 但如果反复使用双击,请不要偷懒。 go the better way.. Create a abstract class n go on.. 走更好的方法..创建一个抽象类继续。

public abstract class DoubleClickListener implements OnClickListener {

private static final long DOUBLE_CLICK_TIME_DELTA = 300;//milliseconds

long lastClickTime = 0;

@Override
public void onClick(View v) {
    long clickTime = System.currentTimeMillis();
    if (clickTime - lastClickTime < DOUBLE_CLICK_TIME_DELTA){
        onDoubleClick(v);
        lastClickTime = 0;
    } else {
        onSingleClick(v);
    }
    lastClickTime = clickTime;
}

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

use it anywhere 随处使用

view.setOnClickListener(new DoubleClickListener() {

    @Override
    public void onSingleClick(View v) {

    }

    @Override
    public void onDoubleClick(View v) {

    }
});

happy coding 快乐编码

You need to implement it all i think , Use this Code: 您需要实现我认为的所有功能,使用此代码:

final GestureDetector gd = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener(){
   //here is the method for double tap
    @Override
    public boolean onDoubleTap(MotionEvent e) {

        //your action here for double tap e.g.
        //Log.d("OnDoubleTapListener", "onDoubleTap");

        return true;
    }

    @Override
    public void onLongPress(MotionEvent e) {
        super.onLongPress(e);

    }

    @Override
    public boolean onDoubleTapEvent(MotionEvent e) {
        return true;
    }

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }


});

//here yourView is the View on which you want to set the double tap action

yourView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        return gd.onTouchEvent(event);
    }
});

Having said that it's more common in android to use longclick instead , 话说回来,在Android中,改用longclick更为常见,

Hope it helps 希望能帮助到你

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM