Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handling Android hardware Back button

I have an onKeyDown event which is only needed for handling the Up and Down hardware keys in my app. For these it returns true, as they are handled. For anything else it returns false which I understand means that the OS should handle them. However, when I press the Back button, my onKeyDown is called and returns false, but there is no other effect. I want/would expect the OS to finish the current Activity and resume the previous one.

Is this correct behavior, or is there something amis?

Update:

Cheers guys, my onKeyDown routine looks like this, now I've followed CommonsWare's advice:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    super.onKeyDown(keyCode, event);

    boolean handled = true;

    // handle key presses
    switch (keyCode) {

    case KeyEvent.KEYCODE_DPAD_LEFT:
        mCursorX = mCursorX - 1;
        if (mCursorX < MAP_MIN_X) { mCursorX = MAP_MIN_X; }
        break;

    case KeyEvent.KEYCODE_DPAD_RIGHT:
        mCursorX = mCursorX + 1;
        if (mCursorX > MAP_MAX_X) { mCursorX = MAP_MAX_X; }
        break;

    default:
        handled = false;

    if (handled) {
        redrawCursorno();
        return true;
    }

    return super.onKeyDown(keyCode,event);
}

My class looks like:

public class Map extends Activity implements OnClickListener, SurfaceHolder.Callback, OnTouchListener {

I must admit I didn't know why the @override and the first 'super' line were there, they were just in all the routines I looked at. If the super.onKeyDown runs the onKeyDown for the Activity, then I probably don't want it at the start, only at the end if my routine doesn't handle it, which I think is what I've added. Does that sound about right, or am I still confused?

-Frink

like image 860
FrinkTheBrave Avatar asked Aug 22 '10 09:08

FrinkTheBrave


3 Answers

I would recommend chaining to the superclass. In other words, instead of:

return(false);

do:

return(super.onKeyDown(...));
like image 200
CommonsWare Avatar answered Oct 21 '22 18:10

CommonsWare


You can override the onBackPressed() method, it will be called when the activity has detected the user's press of the back key. In this case, you don't need to use the onKeyDown method.

like image 39
Karan Avatar answered Oct 21 '22 19:10

Karan


Also, you're calling super.onKeyDown() twice: once at the beginning of the function and once at the end. You should only need the one at the end.

like image 21
joeo Avatar answered Oct 21 '22 18:10

joeo