2012-06-30 129 views
20

我想抓住按鍵的任何鍵的按下。我不想在我的活動中使用EditView或TextView,必須從我的活動中的擴展視圖處理事件。Android - 獲取鍵盤按鍵

我只是嘗試這樣做:

1)重寫onKeyUp(int keyCode, KeyEvent event)活性的方法。這不適用於軟鍵,它只是抓住幾個硬鍵盤。

2)創建我的OnKeyListener並在我的視圖中註冊,其中包含已註冊並正在運行的OnTouchListener。這對softkeyboar根本不起作用。 3)覆蓋onKeyUp(int keyCode, KeyEvent event)查看方法。如果我設置了我的OnKeyListener,或者我沒有設置它,這一切都無法工作。

4)與InputMethodManager對象調用方法showSoftInput並將其傳遞給我的View。這不起作用,因爲我不得不打電話給toggleSoftInput;也不是爲了趕上關鍵事件。

我測試了所有隻在模擬器中,但我認爲這就夠了。爲什麼從鍵盤上採取一個簡單的關鍵事件是如此複雜?在Activity

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

當你檢查的源代碼,像'EditText'和類'TextView',看他們如何處理它,你學到了什麼? – CommonsWare

+5

研究源代碼可以幫助但花費太多時間。 – Bemipefe

回答

31

試試我能得到KeyPress事件。爲了使鍵碼可打印,我已經使用了功能getUnicodeChar傳遞它的元按鈕狀態,然後只是一個字符鑄造解決問題。

這是工作代碼

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

當然,這項工作只用ASCII字符。

+0

它的工作!非常感謝vasart – Bemipefe

+0

但是,長按彈出窗口時所選字符存在問題。例如,如果我長按'a'並選擇'à'getKeyCode和getUnicodeChar返回0 – Bemipefe

+0

查看'KeyEvent'類中的'getDeadChar()'方法 – vasart

13

使用dispatchKeyEvent(KeyEvent event)隨着vasart的提示

+0

在我的情況下,自定義鍵盤視圖沒有響應dispatchkeyEvent ..我已經實現了keyboardView,我想要檢測像ctrl + c,Ctrl + v這樣的組合鍵。我該如何實現這一目標 – Roster

0

當鍵盤在活動開啓您的活動實際上變成前景... 所有的TextArea或TextField的有自己的機制,以獲得從屏幕鍵盤的keyPressed ... 如果你想使用的onkeydown()聽者的虛擬鍵盤化妝確定你在AndroidManifest文件中設置了你的活動android:windowSoftInputMode =「stateAlwaysVisible」然後onkeyDown()會工作它確實爲我工作...