我目前正在开发一款用于调整座位的Android应用。我想要包括的一个特征是当座椅向一个方向移动按钮一段时间后,使座椅移动得更快。
为此目的,我想这样开始:当我触摸一个按钮(在我的代码“seat_down”中)时,应用程序应发送信号“1”。经过一段时间(在我的代码中为5秒)触摸按钮(并且只有在这五秒钟后仍然触摸它)时,应用程序应发送信号“0”。因此,如果我只触摸按钮四秒钟然后松开,应用程序应该只发送信号“1”,而不是之后发送“0”。
您可以在底部看到代码。
我的应用程序到底在做什么?
触摸该按钮的时间超过五秒,该应用程序可以按我的意愿运行。所以它在触摸按钮时发送信号“1”,五秒后发送“0”。尼斯!
当我触摸按钮的时间超过五秒时,它也会在开头发送“1”,并在五秒后发送“0”。 :((
不知何故,当我不再触摸按钮时,“myHandler.removeCallbacks(MyRunnable)”无效。但是当我按下按钮时应用程序发送消息“2”,因此它识别出“MotionEvent.ACTION_UP”。 当我在我的代码的另一个位置写“myHandler.removeCallbacks(MyRunnable)”时,例如“return true”之前的一行,它会完全停止postDelayed。不幸的是,即使我仍然按下按钮,它也会一直停止postDelayed。
我还尝试用java的标准循环做一个计时器,并在互联网上搜索了很多,但我找不到真正解决我问题的东西。我知道有“OnLongClickListener”,但它被激活的时间跨度太短。我还读到了关于Timer方法和AsyncTask的内容,但我希望在没有它的情况下处理它。
如果你能帮助我,我将非常感激!谢谢!!!
CODE
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;
}} );
答案 0 :(得分:2)
每次调用onTouch时都会创建一个处理程序...将runnable发送到的处理程序和调用removeCallbacks的处理程序是两个不同的处理程序,与runnable相同。 只需在onCreate中创建处理程序和runnable ......或者使用
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);
}