2014-01-31 35 views
1

我目前正在調整座位的Android應用程序。我想包括的一個功能是使按鈕在一個方向上移動座椅的按鈕在一定時間內觸碰,以使座椅更快地移動。爲此,我想要這樣開始:當我觸摸一個按鈕(在我的代碼「seat_down」)時,應用程序應該發送信號「1」。經過一段時間(在我的代碼中,它是五秒鐘)觸摸按鈕(並且只有當它在這五秒之後仍然被觸摸時),應用程序應該發送信號「0」。因此,如果我只觸摸按鈕四秒鐘然後放開,應用程序應該只發送信號「1」,而不是「0」之後。Android - 按鈕計時器(處理程序 - RemoveCallback不會停止PostDelayed)

您可以在底部看到代碼。

我的應用真的在做什麼?

觸摸按鈕的時間超過5秒鐘,該應用程序按我的需要工作。因此,在觸摸按鈕時發送信號「1」,並在五秒鐘後發送「0」。太好了!

當我觸摸按鈕的時間短於5秒時,它也在開始時發送「1」,在5秒後發送「0」。 :((

不知何故,「myHandler.removeCallbacks(MyRunnable)」不工作時,我不再觸摸按鈕了,但應用程序發送消息「2」,當我讓按鈕,因此它正在識別「MotionEvent.ACTION_UP」 當我在我的代碼的另一個位置寫入「myHandler.removeCallbacks(MyRunnable)」時,例如「返回true」之前的一行,它完全停止了postDelayed。不幸的是,它停止了我一直試圖用java的標準循環做一個計時器,並在互聯網上搜索了很多東西,但是我找不到真正解決的問題。我的問題,我知道有「OnLongClickListener」,但時間跨度,直到它activa特德太短了。我也讀過關於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; 

     }}); 

回答

2

您創建一個處理程序每​​次你打電話onTouch ...處理程序你把你的可運行和你呼籲removeCallbacks的處理程序是兩個不同的處理程序,同樣的你可運行。 剛剛創建的處理程序,並在你的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); 
} 
+0

我複製我的處理程序從的onResume到的onCreate UND Runnable接口。那裏說它沒有使用myHandler和MyRunnable。在我的onResume seat_down方法中,它說,myHandler無法解析,MyRunnable無法解析爲變量。 你的第二個建議我真的不明白。我試圖將它包含在onCreate(「死代碼」)以及onResume seat_down-method(「myHandler不能解析爲變量」)。 – user3256557

+0

@ user3256557,檢查我的更新。你必須在你的OnTouchListener之外創建你的Handler和Runnable。 – ElDuderino

+0

現在,它的工作原理!非常感謝您的幫助!!! – user3256557