【关于重载OnBackPressed无效的解决方案】

简介:

    在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,如需转载请自行联系原作者







相关文章
|
3月前
|
网络协议 C++
一文彻底解决C++中的重载、重写和隐藏操作
一文彻底解决C++中的重载、重写和隐藏操作
56 0
|
8月前
方法的重载和方法覆盖的区别
方法的重载和方法覆盖的区别
33 0
|
9月前
|
Java 编译器
重载的方法能否根据返回类型进行区分?
重载的方法不能根据返回类型进行区分。方法的重载是基于方法名称和参数列表来进行区分的,与返回类型无关。这是因为在Java中,编译器在确定要调用哪个重载方法时,仅根据传递给方法的参数来进行决策。
230 0
|
11月前
使用timeBeginPeriod函数出现错误的解决方案
使用timeBeginPeriod函数出现错误的解决方案
54 0
|
编译器 C++
C/C++普通函数与函数模板的区别,调用规则,模板局限性
C/C++普通函数与函数模板的区别,调用规则,模板局限性
82 0
C/C++普通函数与函数模板的区别,调用规则,模板局限性
覆盖(重写),重构,重载的区别
1:重构: 重构, 是对软计设计方法的描述, 这个层面是架构和设计方法,例如有一个文档一开始叫做:names.txt,过几天你发现这个文档的名字怎么看怎么不顺眼,就是想改名字,这可以叫做是重构。 重构是一个软件维护的通用技巧, 重构的具体做法, 可以通过重写或者重载等, 但不限于此, 更改注释, 更改函数名类名等,都可以称之为重构,重构的目的是为了让软件容易维护, 修改其Bug等.
1195 0
|
Windows 开发工具
UWP项目生成错误: 未能使用“CompileXaml”任务的输入参数初始化该任务。“CompileXaml”任务不支持“PlatformXmlDir”参数。请确认该参数存在于此任务中,并且是可设置的公共实例属性。
项目属性: 目标版本 16299  最低版本 14393   解决方法:目标版本 15063 最低版本 14393   The issue is a bug in the Windows SDK that is causing an incompatible MSBuild tasks as...
1441 0