2012-11-27 22 views
8

Zajmuję się tworzeniem aplikacji TV-Remote Simulator w systemie Android przy użyciu określonego oprogramowania pośredniego (nie ma znaczenia).Jak zrobić coś wielokrotnie, gdy przycisk jest naciśnięty?

W przypadku przycisków głośności (Volume + i Volume-) staram się wysyłać wielokrotnie sygnał "Volume Up", gdy jego przycisk jest naciśnięty.

To co próbowałem w ostatniej (kod dla jednego z przycisków, drugi musi być identyczne z wyjątkiem nazw):

  1. Deklarowana wartość logiczną zmienna

    boolean pressedUp = false; 
    
  2. ogłoszony klasa wewnętrzna z następującym AsyncTask:

    class SendVolumeUpTask extends AsyncTask<Void, Void, Void> { 
    
        @Override 
        protected Void doInBackground(Void... arg0) { 
         while(pressedUp) { 
          SendVolumeUpSignal(); 
        } 
        return null; 
    } 
    

    }

  3. Dodaj słuchacza do przycisku:

    final Button buttonVolumeUp = (Button) findViewById(R.id.volup); 
    buttonVolumeUp.setOnTouchListener(new View.OnTouchListener() { 
    
        @Override 
        public boolean onTouch(View v, MotionEvent event) { 
         switch (event.getAction()) { 
    
         case MotionEvent.ACTION_DOWN: 
    
          if(pressedUp == false){ 
           pressedUp = true; 
           new SendVolumeUpTask().execute(); 
          } 
    
         case MotionEvent.ACTION_UP: 
    
          pressedUp = false; 
    
        } 
         return true; 
        } 
    }); 
    

Ja również próbowałem z prostych nitek jak w Increment-Decrement counter while button is pressed ale nie działało. Aplikacja działa dobrze dla pozostałych przycisków (kanałów itp.), Ale zmiana głośności jest całkowicie ignorowana.

Odpowiedz

3

Zapomniałeś dodać przerwę; na końcu zdarzenia MotionEvent.ACTION_DOWN:. Oznacza to, że linia pressedUp = false; zostanie wykonany nawet przy tej czynności. Prawidłowe rozwiązanie to:

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    switch (event.getAction()) { 

    case MotionEvent.ACTION_DOWN: 

     if(pressedUp == false){ 
      pressedUp = true; 
      new SendVolumeUpTask().execute(); 
     } 
    break; 
    case MotionEvent.ACTION_UP: 

     pressedUp = false; 

} 
    return true; 
} 
+0

Dzięki, teraz sygnały są wysyłane. Jednakże wysyła on dużo sygnałów przez krótki czas prasowania. Być może licznik powinien działać. – Truncarlos

+4

Polecam odstęp między wywołania SendVolumeUpSignal(); Na przykład spróbuj tego: 'while while (pressedUp) { SendVolumeUpSignal(); Thread.sleep (100);} ' –

+0

Przydatne. Dzięki: D – Truncarlos

2

Czy uważane

  • Rozpoczęcie repititive zadanie na razie
  • Zatrzymywanie zadania na razie onKeyUp onKeyDown?
+1

Czy te metody nie są fizycznymi kluczami urządzenia? Miałem na myśli dotykowe w mojej zdalnej aplikacji – Truncarlos

+0

tak, nazwa sugeruje tak .. ale nie są :-) –

+0

W każdym razie poprzednia odpowiedź pomogła mi wystarczająco, dzięki: D – Truncarlos