2010-07-10 44 views
6

我想通過音量調高和調低來進行輸入。目前,我的代碼是:接管Android上的音量鍵

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 

    Log.v(TAG, event.toString()); 
    if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN){ 
     mLamp.moveBackward(); 

     return false; 
    } 
    else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP){ 
     mLamp.moveForward(); 

     return false; 
    } 

    return true; 
} 
public boolean onKeyUp(int keyCode, KeyEvent event) { 

    Log.v(TAG, event.toString()); 
    if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN){ 
     return false; 
    } 
    else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP){ 
     return false; 
    } 

    return true; 
} 

這會觸發mLamp.moveBackward()mLamp.moveForward()功能,但它仍然改變鈴聲的音量。 我必須做什麼,鈴聲響度不會改變?

回答

19

如果您處理該事件,請返回true。 如果您想讓事件爲 由下一個接收者處理,請返回 false

+0

簡單而有效的答案。那應該是這樣。謝謝。 – mad 2011-01-30 09:26:29

+1

vod23的答案對於保持其他按鈕的正常工作至關重要。 – 2013-03-05 12:22:24

8

如果處理事件,則返回true很重要,但如果您未處理該事件,則最好確保該事件仍由超類處理。這裏是我的應用程序的一些代碼:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || 
     keyCode == KeyEvent.KEYCODE_VOLUME_UP) { 
     changeColor(keyCode); 

     return true; 
    } 

    return super.onKeyDown(keyCode, event); 
} 

@Override 
public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || 
     keyCode == KeyEvent.KEYCODE_VOLUME_UP) { 
     // do nothing              

     return true; 
    } 

    return super.onKeyUp(keyCode, event); 
} 

在我的情況下,超類的調用是必要的,以便我的設備上的其他硬件按鈕繼續工作。

-2
public boolean dispatchKeyEvent(KeyEvent event) { 

    if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_UP) {    
      return true; 
    } else if (event.getKeyCode() == KeyEvent.KEYCODE_VOLUME_DOWN) { 
      return true; 
    } 
    return dispatchKeyEvent(event); 
} 
+2

您的最後一行將遞歸調用導致stackoverflow或ANR的方法,以先發生者爲準。 – William 2015-01-07 21:47:23