2009-10-20 15 views
6

Stworzyłem prostą grę na Androida opartą na próbce Lunar Lander i mam problem z obsługą kluczowych zdarzeń. Gdy aktywność się rozpocznie, jedynymi kluczami, do których wywoływane są funkcje onKeyDown lub onKeyUp, są klawisze dpad w górę/w dół/w lewo/w prawo. Przyciski menu, back i dpad_center nie wyzwalają metod onKey. Jednak po naciśnięciu jednego z przycisków dpt w górę/w dół/w lewo/w prawo naciśnięcie klawiszy menu, wstecz lub dpad_center uruchamia te metody. Nie dostaję żadnych błędów ani żadnego wskazania, co się dzieje.Funkcja onKeyDown nie zawsze jest wywoływana w aplikacji na Androida

Możliwe, że ostrość jest ustawiona nieprawidłowo - aktywność rozpoczyna się od przycisku na ekranie, więc może być w trybie ekranu dotykowego. Jeśli tak, to czy dotknięcie przycisku Wstecz nie powinno doprowadzić mnie do właściwego trybu ustawiania ostrości, abym mógł złapać to wydarzenie?

Używam emulatora z SDK-1.5r3. Nie byłem w stanie wypróbować tego na prawdziwym telefonie. Oto moja wersja onKeyDown.

public boolean onKeyDown(int keyCode, KeyEvent msg) 
{ 
    Log.d(TAG, "onKeyDown: " + keyCode); 
    return super.onKeyDown(keyCode, msg); 
} 

Dzięki

Matt

Odpowiedz

24

Czy to onKeyDown w widoku lub w działalności?

Jeśli wywoływana jest funkcja setContentView podczas przechodzenia do widoku, a widok ten wywołał funkcję setFocusable (true), wszystkie zdarzenia kluczowe omijają działanie i przechodzą bezpośrednio do widoku. Z drugiej strony, jeśli twoja funkcja onKeyDown jest w widoku i nie wywołałeś setContentView w działaniu i setFocusable (true) w widoku, to twoja aktywność otrzyma kluczowe zdarzenia, a nie widok.

Poszukaj tych konkretnych połączeń, ale uważam, że masz rację, ponieważ jest to kwestia skupienia.

+6

To było w widoku - ale podczas sprawdzania tego, zdałem sobie sprawę, że nie mam włączonego trybu setFocusableInTouchMode - dodając, że w rozwiązaniu problemu. –

+0

Ah, spoko. Przykro mi, że przegapiłem faktyczny problem, ale cieszę się, że mogłem pomóc. – haseman

+1

Próbowałem tego w fragmencie, ale widok onKeyDown() mojego widoku nigdy nie jest wywoływany, mimo że ustawiłem jego skupienie na true: 'searchView.setFocusable (true); searchView.setFocusableInTouchMode (true); '. Zdarzenie onKeyDown() wywoływane jest jednak, ale niestety dla klawisza powrotu. – faizal

6

Metody onKeyDown w działaniu/onKeyUp nie zawsze wywoływane. W przeciwieństwie do nich, dispatchKeyEvent na Aktywności był zawsze wywoływany. Przenieś tutaj logikę kluczowania/kluczowania. Działa dobrze.

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_DOWN) { 
     // keydown logic 
     return true; 
    } 
    return false; 
} 
+1

Dziękuję za przesłanie tego. bardzo pomocne :) –

Powiązane problemy