3

我试图在我的应用程序中拦截后退按钮事件以获取一些自定义功能,但我在相关回调中编写的任何内容都没有被执行,而且我一生都无法理解为什么。

这是我重写的方法:

@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 仍然没有被调用,这很奇怪,但是 key up 似乎是一个足够的工作。

@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 回调仍然会很好。

4

3 回答 3

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);
    }
}
于 2013-10-01T00:12:46.573 回答
0

我想我应该把它放到一个答案中,以便更容易找到:

我注意到 onKeyUp 回调现在似乎正在工作。我不确定我在做什么不同。然而,key down 和 onBackPressed 仍然没有被调用,这很奇怪,但是 key up 似乎是一个足够的工作。

@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 回调仍然会很好。

于 2015-09-26T21:35:43.947 回答
0
backButtonRl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getActivity().onBackPressed();
            }
        });
于 2016-04-27T08:50:57.253 回答