2014-01-31 2 views
1

В настоящее время я работаю над приложением android для регулировки мест. Одна из особенностей, которую я хочу включить, состоит в том, чтобы заставить сиденье двигаться быстрее, когда кнопка для перемещения сиденья в одном направлении коснется в течение определенного времени.Android-Button Timer (Handler - RemoveCallback не остановит PostDelayed)

С этой целью я хочу начать следующим образом: когда я касаюсь кнопки (в моем коде «seat_down»), приложение должно отправить сигнал «1». Через некоторое время (в моем коде пять секунд), касаясь кнопки (и только когда она по-прежнему коснется после этих пяти секунд), приложение должно отправить сигнал «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, но я надеялся справиться с этим без этого.

Буду очень признателен, если вы могли бы помочь мне с этим! Спасибо!!!

КОД

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; 

     }}); 

ответ

2

Вы создаете обработчик каждый раз вы называете onTouch ... обработчик вы посылаете ваш работоспособной в и обработчик вы звоните removeCallbacks на две разные обработчики, то же самое с вашим исполняемым. Просто создайте обработчик и с выполняемым в вашем OnCreate ... или с

if(handler==null) handler = new Handler() ... 

Update:

@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); 
} 
+0

Я скопировал мой Handler унд Runnable из onResume в OnCreate. Там говорится, что myHandler и MyRunnable не используются. В моем методе onResume seat_down сказано, что myHandler не может быть разрешен, и MyRunnable не может быть разрешен переменной. Ваше второе предложение, которое я действительно не понял. Я попытался включить его в onCreate («мертвый код»), а также в метод onResume seat_down («myHandler не может быть разрешен переменной»). – user3256557

+0

@ user3256557, проверьте мое обновление. Вы должны создать свой обработчик и Runnable вне вашего OnTouchListener. – ElDuderino

+0

Теперь это работает! Большое спасибо за Вашу помощь!!! – user3256557

Смежные вопросы