2017-04-05 3046 views
-2

我正在製作一個應用程序,其中某些小部件即時創建,可以通過拖放進行重新排列。我試圖實現兩件事情:如何取消postDelayed()的執行

  1. 長按啓動拖放
  2. 短按(或點擊)打開菜單更改某些設置。

但我有一個問題,我無法取消處理程序的postdelayed()函數中的代碼。我正在使用下面的代碼來實現它。

 _sliders_item[_sliders_counter].setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(final View v, MotionEvent event) { 
       Handler hndlr = new Handler(); 
       Runnable _run = new Runnable() { 
        @Override 
        public void run() { 
         ClipData data = ClipData.newPlainText("", ""); 
         View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); 
         v.startDrag(data, shadowBuilder, v, 0); 
         v.setVisibility(View.INVISIBLE); 
         _t1.setText("executed"); 
         _t1.show(); 
        } 
       }; 
       if (_enable_editor) { 
        if (event.getAction() == MotionEvent.ACTION_DOWN) { 
         hndlr.postDelayed(_run,1000); 
         //return true; 
        } 
        if (event.getAction() == MotionEvent.ACTION_UP){ 
         _t1.setText("menu"); 
         _t1.show(); 
         hndlr.removeCallbacks(_run); 
         //return true; 
        } 
       } 
       return _enable_editor; 
      } 
     }); 

但問題是,當我長按對象,它工作正常。我可以啓動拖放。但是當我按下它時,會執行ACTION_UP事件的代碼,但runnable中的代碼仍會執行。短按對象時如何取消可運行代碼?

回答

0

onTouch事件之外聲明您的Runnable事件,就像您的類中的單獨方法。然後,當你想要實際執行runnable時,請調用你的方法。

Quick'n'Dirty例子:

onTouch(..) { 
    if (eventDown) { 
    // start Runnable 
    } 

    if (eventUp) { 
    // Do not call runnable 
    } 

} 

private void executeMyRunnable(/* Any arguments you need in Runnable */) { 
    // Your runnable code here 
} 
+0

我不能這樣做。我的應用程序創建了多個動態添加的相同對象。並且runnable中的代碼必須針對特定的對象。 –

+0

但是你的動態對象必須有一些標識。所以你不能將該參數傳遞給runnable方法?這樣你就可以知道當前正在運行哪個對象。 –

+0

對於你的runnable,你的TouchListener需要的是對VIEW對象的引用。當你想運行它時,你可以將該對象傳遞給你的Runnable方法。 –

0

您可以通過採取在action.down和系統時間action.up系統時間之間的時間差檢查長按。如果差值大於5000毫秒,則執行可運行代碼,否則執行對話代碼。

3

您必須保留對您的RunnablesHandler的引用並使用Handler#removeCallbacks()

所以基本上:

Handler h = new Handler(); 
Runnable r = new Runnable() { /* does something */ 
h.postDelayed(r, 1000); 

// When you want to cancel. 
h.removeCallbacks(r); 
+1

這就是我所做的。再次閱讀這個問題......這是行不通的。 –

+0

您每次都創建一個新的處理程序和一個新的Runnable。你需要保持對兩者的引用。再次閱讀我的答案。 – DeeV