我目前正在开发一款用于调整座椅的 Android 应用程序。我想包括的一个功能是让座椅移动得更快,当触摸按钮向一个方向移动座椅一定时间时。
为此,我想这样开始:当我触摸一个按钮(在我的代码“seat_down”中)时,应用程序应该发送信号“1”。在一定时间后(在我的代码中是五秒)触摸按钮(并且只有在这五秒后它仍然被触摸时)应用程序应该发送信号“0”。因此,如果我只触摸按钮四秒钟然后松手,应用程序应该只发送信号“1”,而不是之后发送“0”。
您可以在底部看到代码。
我的应用真正在做什么?
触摸按钮超过 5 秒,应用程序将按我希望的方式运行。所以它在触摸按钮的那一刻发送信号“1”,五秒后发送“0”。不错!
当我触摸按钮的时间短于五秒时,它还会在开始时发送“1”,在五秒后发送“0”。 :((
不知何故,当我不再触摸按钮时,“myHandler.removeCallbacks(MyRunnable)”无法正常工作。但是当我松开按钮时应用程序发送消息“2”,因此它正在识别“MotionEvent.ACTION_UP”。 当我在代码的另一个位置编写“myHandler.removeCallbacks(MyRunnable)”时,例如“return true”之前的一行,它会完美地停止 postDelayed。不幸的是,即使我仍在触摸按钮,它也会一直停止 postDelayed。
我也尝试用 java 的标准循环做一个计时器并在互联网上搜索了很多,但我找不到真正解决我问题的东西。我知道有“OnLongClickListener”,但它被激活的时间跨度太短了。我还阅读了有关 Timer 方法和 AsyncTask 的内容,但我希望没有这些方法也能处理它。
如果你能帮我解决这个问题,我将不胜感激!谢谢!!!
代码
seat_down = (ImageButton) findViewById(R.id.arrow_down);
seat_down.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Handler myHandler = new Handler();
final Runnable MyRunnable = new Runnable() {
@Override
public void run() {
String message2 = "0";
sendMessage(message2);
}
};
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
String message1 = "1";
sendMessage(message1);
myHandler.postDelayed(MyRunnable, 5000);
break;
case MotionEvent.ACTION_UP:
myHandler.removeCallbacks(MyRunnable);
break;
}
return true;
}} );
最佳答案
您每次调用 onTouch 时都会创建一个处理程序...您将 runnable 发送到的处理程序和您调用 removeCallbacks 的处理程序是两个不同的处理程序,与您的 runnable 相同。 只需在您的 onCreate... 或使用
创建处理程序和可运行对象if(handler==null) handler = new Handler() ...
更新:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Handler handler = new Handler();
final Runnable runnable = new Runnable() {
@Override
public void run() {
sendMessage("0");
}
};
Button btn = (Button) findViewById(R.id.btn);
btn.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
sendMessage("1");
handler.postDelayed(runnable, 5000);
break;
case MotionEvent.ACTION_UP:
handler.removeCallbacks(runnable);
break;
}
return true;
}
});
}
private void sendMessage(String message) {
Log.i("Message", message);
}
关于java - Android - 按钮计时器(处理程序 - RemoveCallback 不会停止 PostDelayed),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21479670/