2012-08-13 38 views
2

我正在創建一個自定義Android組件,它需要有時需要使用onBackPressed事件(例如,自定義ViewGroup中有一個彈出菜單,如果它顯示,後退按鈕事件關閉它並被消耗,否則將被忽略)。那可能嗎?我可以從ViewGroup子類中截取這個事件嗎?我可以在自定義ViewGroup中獲取onBackPressed事件嗎?

編輯: 我試着重寫onKeyPreIme,因爲Android文檔暗示,該方法永遠不會從ViewGroup中調用。

@Override 
public boolean onKeyPreIme(int keyCode, KeyEvent event) 
{ 
    return true; 
} 

onKeyPreIme文檔它說:前它通過與視圖層次結構相關聯的任何輸入方法處理

處理的鍵事件。這可以用於在IME消耗它們之前在特殊情況下截獲關鍵事件;一個典型的例子是處理BACK鍵來更新應用程序的UI,而不是讓IME看到它並關閉它自己。

回答

9

從不調用onKeyDown或onKeyPreIme的原因是因爲ViewGroup沒有焦點。

的解決方案是要求聚焦在子類的ViewGroup構造:決不會從該子類的ViewGroup中調用

this.setFocusable(true); 
this.setFocusableInTouchMode(true); 
this.requestFocus(); 
2

onBackPressed屬於活動和視圖/ viewgroups是東西置於其內活動。所以從技術上講,你不能完成這件事。但是,您可以使用某種observer/observable模式將任何類型的信息傳遞給您的視圖。

或者嘗試使用onKeyDown您的視圖類中的事件並跟蹤back key事件代碼。

+0

onKeyDown事件。至於觀察者/觀察者,它需要我手動將事件從我的活動內部傳遞給我,這看起來像是黑客。我希望ViewGroup子類在不介入的情況下攔截事件。可能嗎? – 2012-08-13 09:42:32

+1

如果onKeyDown不在你的情況下工作(我也懷疑),所以我認爲觀察者/可觀察模式是我腦海中唯一可用的最佳選擇。但是,您也可以嘗試在viewgroup類中定義一個自定義方法,並在onBackKeyPressed事件中從您的活動類中調用此方法。這在某種程度上有助於跳過觀察者/可觀察模式,以防您的代碼在未來看起來很花哨並且支持多個其他調用:) – waqaslam 2012-08-13 10:04:24

相關問題