在android的開發中,很多時候我們希望使用者在點選手機的傳回鍵時不要結束程式,而是進行我們需要的其他邏輯路徑,比如詢問使用者是否确定退出:
<a target="_blank" href="http://blog.51cto.com/attachment/201208/170521309.png"></a>
我們知道,在android 1.5之前,需要重載onKeyDown并在該方法中監聽KeyEvent.KEYCODE_BACK鍵盤事件,然後做出相應邏輯操作(具體做法網上很多,bill不再贅述),android 1.5之後,新增了一個獨立的監聽傳回鍵的方法——onBackPressed(),我們隻需在Activity中重載該方法并在其中寫上相應邏輯即可。
然而,事情遠非我們想象的那麼順利。上述方法通常情況下都能夠正常運作,但是當我們在TabActivity的子類中重載onBackPressed方法時,奇怪的事情出現了,我們像往常一樣,按下傳回鍵,以為程式會像往常一樣,彈出我們設定好的視窗,可結果是,程式終止了,就像從來沒有重載過onBackPressed()一樣。
于是bill在onBackPressed方法中打上斷點,情況如預料的一樣,斷點從未被激活。奇了怪了,bill百思不得其解,曾一度懷疑onBackPressed方法是否存在bug,于是bill不斷地在其他Activity中做着實驗,這些Activity的表現都很正常,傳回鍵按下後斷點被激活,可唯獨TabActivity及其派生類表現異常。bill斷定問題應該出在TabActivity而不是onBackPressed方法本身。于是bill向TabActivity中添加了其他按鍵的監聽,結果這些監聽都沒有起到任何作用。
經過不斷地思考和折騰,bill總算解決此問題,原因也很簡單——TabActivity不具備焦點。也就是說,TabActivity不會對任何按鍵監聽産生反應。
<a href="http://blog.51cto.com/attachment/201208/194605418.png" target="_blank"></a>
問題的原因已經找到,如何解決?原來,TabActivity中至少有一個子Activity,而這才是真正具備焦點的Activity。
是以,我們隻需要重載各個子Activity中的onBackPressed()方法即可實作我們預想的邏輯效果。
本文轉自Bill_Hoo 51CTO部落格,原文連結:http://blog.51cto.com/billhoo/978439,如需轉載請自行聯系原作者