在android的开发中,很多时候我们希望用户在点击手机的返回键时不要结束程序,而是进行我们需要的其他逻辑路径,比如询问用户是否确定退出:
我们知道,在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不会对任何按键监听产生反应。
问题的原因已经找到,如何解决?原来,TabActivity中至少有一个子Activity,而这才是真正具备焦点的Activity。
因此,我们只需要重载各个子Activity中的onBackPressed()方法即可实现我们预想的逻辑效果。
本文转自Bill_Hoo 51CTO博客,原文链接:http://blog.51cto.com/billhoo/978439,如需转载请自行联系原作者