【问题标题】:Apply double tap on textview is not working在 textview 上应用双击不起作用
【发布时间】:2017-01-30 11:29:43
【问题描述】:

我想在双击 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);
    }
});

这会返回 ontapevent

【问题讨论】:

标签: android textview double


【解决方案1】:

您可能需要创建新的类实现 Onclick。正常点击会延迟 400 毫秒,直到使用 Timer 检测到第二次点击。如果 400 毫秒后没有第二次点击不存在,则考虑 One Tap

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

如何使用

view.setOnClickListener(new DoubleClickListener() {

            @Override
            public void onSingleClick(View v) {

            }

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

【讨论】:

  • 不错的解决方案,有效。也许有点重 - 但足够了。太好了!
【解决方案2】:

一种惰性实现

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

但如果一次又一次地使用双击,请不要偷懒。走更好的路。。 创建一个抽象类 n 继续..

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

在任何地方使用它

view.setOnClickListener(new DoubleClickListener() {

    @Override
    public void onSingleClick(View v) {

    }

    @Override
    public void onDoubleClick(View v) {

    }
});

【讨论】:

  • 不起作用。双击会发生什么? [1] 单击进来...没有以前的...所以方法被调用。 [2] 然后第二次点击进来......但一切都已清除。见下文。
【解决方案3】:

我认为你需要实现它,使用这个代码:

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

虽然说在 android 中更常见的是使用 longclick 来代替。

【讨论】:

    猜你喜欢
    • 2014-01-15
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多