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 コールバックが機能しているように見えることに気付きました。私はまだ何をしているのか分かりません。キーダウンと 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 コールバックが呼び出されない理由を理解しておくとよいでしょう。

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 コールバックが機能しているように見えることに気付きました。私はまだ何をしているのか分かりません。キーダウンと 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 コールバックが呼び出されない理由を理解しておくとよいでしょう。

于 2015-09-26T21:35:43.947 に答える