我正在创建一个应用程序,其中可以动态创建某种小部件,并可以通过拖放重新排列。我正在尝试实现两件事:
但是我遇到了一个问题,我无法取消处理程序的postdelayed()函数中的代码。我正在使用以下代码来实现它。
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Test");
Console.ReadLine();
}
}
但问题是,当我长按对象时,它工作正常。我可以开始拖放。但是当我按下它时,ACTION_UP事件的代码会执行,但runnable中的代码仍会执行。当我短按对象时如何取消可运行代码?
答案 0 :(得分:4)
您必须保留对Runnables
和Handler
的引用,并使用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
事件之外声明您的onTouch
,就像您的班级中的单独方法一样。然后,当您想要实际执行runnable时,请调用您的方法。
快速'肮脏的例子:
onTouch(..) {
if (eventDown) {
// start Runnable
}
if (eventUp) {
// Do not call runnable
}
}
private void executeMyRunnable( /* Any arguments you need in Runnable */) {
// Your runnable code here
}
答案 2 :(得分:0)
您可以通过在action.down上的系统时间和action.up上的系统时间之间的时间差来检查长按。如果差异大于5000毫秒,则执行可运行代码,或者执行对话框代码。
答案 3 :(得分:0)
只需运行handler.removeCallbacksAndMessages(null);