我正在製作一個應用程序,其中某些小部件即時創建,可以通過拖放進行重新排列。我試圖實現兩件事情:如何取消postDelayed()的執行
- 長按啓動拖放
- 短按(或點擊)打開菜單更改某些設置。
但我有一個問題,我無法取消處理程序的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中的代碼仍會執行。短按對象時如何取消可運行代碼?
我不能這樣做。我的應用程序創建了多個動態添加的相同對象。並且runnable中的代碼必須針對特定的對象。 –
但是你的動態對象必須有一些標識。所以你不能將該參數傳遞給runnable方法?這樣你就可以知道當前正在運行哪個對象。 –
對於你的runnable,你的TouchListener需要的是對VIEW對象的引用。當你想運行它時,你可以將該對象傳遞給你的Runnable方法。 –