2012-06-30 16 views
20

Chcę uchwycić naciśnięcie dowolnego klawisza w softkeyboard. Nie chcę edytować ani widoku tekstu w mojej aktywności, zdarzenie musi być obsługiwane z rozszerzonego widoku w mojej aktywności.Android - Uzyskaj naciśnięcie klawisza klawiatury

Właśnie próbowałem:

1) Zastąpić metodę onKeyUp(int keyCode, KeyEvent event) aktywny. To nie działa z softkeybord, po prostu łapie kilka hardkeyboard.

2) Utwórz mój OnKeyListener i zarejestruj go w moim widoku, który zawiera zarejestrowany i działający OnTouchListener. To nie działa w ogóle przy pomocy softkeyboar.

3) Zastąpienie metody widoku onKeyUp(int keyCode, KeyEvent event). To nie działa wcale niether, jeśli ustawię mój OnKeyListener, lub jeśli go nie ustawię.

4) Z obiektem InputMethodManager Zadzwoń do metody showSoftInput i przekaż mu mój widok. To nie działa ani dla podniesienia klawiatury, rzeczywiście muszę zadzwonić pod numer toggleSoftInput; ani złapać kluczowych wydarzeń.

Testowałem wszystko tylko w emulatorze, ale uważam, że wystarczy. Dlaczego tak trudno wziąć proste wydarzenie z klawiatury?

+0

A kiedy zbadał kod źródłowy do klas, takich jak 'EditText' i' TextView', aby zobaczyć, jak sobie z tym, co się nauczyłeś? – CommonsWare

+5

Badanie kodu źródłowego może pomóc, ale wymaga czasu. – Bemipefe

Odpowiedz

31

Spróbuj użyć dispatchKeyEvent(KeyEvent event) w swojej Activity

@Override 
public boolean dispatchKeyEvent(KeyEvent event) { 
    Log.i("key pressed", String.valueOf(event.getKeyCode())); 
    return super.dispatchKeyEvent(event); 
} 
+0

To działa! Dziękuję bardzo vasart – Bemipefe

+0

Jednak są problemy z postacią wybraną przez popup, które pojawiają się po długim naciśnięciu. Na przykład, jeśli długo naciśnij "a" i wybiorę "à" zarówno getKeyCode, jak i getUnicodeChar return 0 – Bemipefe

+0

Zobacz metodę 'getDeadChar()' w klasie 'KeyEvent' class – vasart

13

Z nutą vasart mogę dostać zdarzenie naciśnięciem klawisza. Aby kod mógł być wydrukowany użyłem funkcji getUnicodeChar przekazując mu stan przycisku meta, a następnie rzut charytatywny rozwiązuje problem.

Jest to kod pracy:

@Override 
public boolean dispatchKeyEvent(KeyEvent KEvent) 
{ 
    int keyaction = KEvent.getAction(); 

    if(keyaction == KeyEvent.ACTION_DOWN) 
    { 
     int keycode = KEvent.getKeyCode(); 
     int keyunicode = KEvent.getUnicodeChar(KEvent.getMetaState()); 
     char character = (char) keyunicode; 

     System.out.println("DEBUG MESSAGE KEY=" + character + " KEYCODE=" + keycode); 
    } 


    return super.dispatchKeyEvent(KEvent); 
} 

Oczywiście to praca tylko z charakterem ASCII.

+0

W moim przypadku widok klawiatury niestandardowej nie odpowiada na komunikat dispatchkeyEvent .. Mam zaimplementowaną funkcję keyboardView i chciałbym wykryć kombinację klawiszy takich jak ctrl + c, Ctrl + v w ten sposób. Jak mogę to osiągnąć – Roster

0

Gdy klawiatura jest otwarty w działalność swoją działalność faktycznie staje się pierwszym planie ... Wszystko TextArea lub Pola tekstowe mają własny mechanizm, aby keypressed z klawiatury ekranowej ... jeśli chcesz używać onKeyDown() listner dla marki wirtualnej klawiatury upewnij się, że ustawiłeś w AndroidzieManifest File pod twoją działalnością android: windowSoftInputMode = "stateAlwaysVisible" to onkeyDown() zadziała, że ​​zadziałało dla mnie ...

1

Nie ma opcji obsługiwania kluczowych zdarzeń naciśnięcia na klawiaturze (np. z klawiaturą ekranową) tylko z klawiatury sprzętowej.

więcej szczegółów: Handling Keyboard Actions

Powiązane problemy