我试图拦截我的应用程序中的后退按钮事件以获得一些自定义功能,但我在相关回调中写的任何内容都没有被执行,我不能为我的生活理解原因。
以下是我重写的方法:
@Override
public void onBackPressed() {
super.onBackPressed();
Log.e(LOG_TAG, "Back pressed");
if (isMainScreenShowing) {
finish();
} else if (isTopLevelScreenShowing){
loadNewScreen(new AccountBalanceInfoFragment());
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.e(LOG_TAG, "Key down = " + keyCode);
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
Log.e(LOG_TAG, "Key up = " + keyCode);
return super.onKeyDown(keyCode, event);
}
如果重要,我将其放入一个扩展ActionBarSherlock中SherlockFragmentActivity的活动中。后退按钮仍可用于从堆栈弹出上一个片段事务,但我无法实现自己的自定义功能。
更新:点击后退按钮时,我注意到以下logcat输出:
10-01 16:42:49.879: D/InputEventConsistencyVerifier(7597): KeyEvent: ACTION_UP but key was not down.`
10-01 16:42:49.879: D/InputEventConsistencyVerifier(7597): in com.android.internal.policy.impl.PhoneWindow$DecorView{40cd4198 V.E..... R.....I. 0,0-480,800}
10-01 16:42:49.879: D/InputEventConsistencyVerifier(7597): 0: sent at 68941888000000, KeyEvent { action=ACTION_UP, keyCode=KEYCODE_BACK, scanCode=158, metaState=0, flags=0x8, repeatCount=0, eventTime=68941888, downTime=68941823, deviceId=0, source=0x101 }
所以关键事件由于某种原因没有被正确处理......对我来说仍然是一个谜。
更新2:我也应该将我写的回复复制到SBerg的答案,因为它是相关的 -
我注意到onKeyUp回调现在似乎正在运行。我不确定我的做法有多么不同。 Key Down和onBackPressed仍然没有被调用,但这很奇怪,但是现在关键似乎是一个充分的解决方法。
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Log.i(LOG_TAG, "Back pressed");
// do stuff here
}
return super.onKeyUp(keyCode, event);
}
这是一个适合现在的解决方法,但它有点乱,并且理解为什么不调用第一个onBackPressed和onKeyDown回调仍然很好。
答案 0 :(得分:4)
如果已按下后退按钮,则需要使 onKeyDownPress 返回 true 。这是你应该怎么做的。 如果您未返回true,则不会传递触摸事件:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.e(LOG_TAG, "Key down = " + keyCode);
if(keyCode == KeyEvent.KEYCODE_BACK){
return true;
}else{
return super.onKeyDown(keyCode, event);
}
}
答案 1 :(得分:0)
我想我应该把它放到答案中,以便更容易找到:
我注意到onKeyUp回调现在似乎正在运行。我不确定我的做法有多么不同。 Key Down和onBackPressed仍然没有被调用,但这很奇怪,但是现在关键似乎是一个充分的解决方法。
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Log.i(LOG_TAG, "Back pressed");
// do stuff here
}
return super.onKeyUp(keyCode, event);
}
这是一个适合现在的解决方法,但它有点乱,并且理解为什么不调用第一个onBackPressed和onKeyDown回调仍然很好。
答案 2 :(得分:0)
backButtonRl.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getActivity().onBackPressed();
}
});