Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to prevent the soft keyboard from ever appearing in my Activity?

I'm writing an Android game that runs in fullscreen landscape mode, and has buttons placed at the bottom left and bottom right of the window. The problem is that one of these buttons is (on many phones) right next to the Menu button, so the player might accidentally press Menu instead.

If it is pressed briefly, I simply pause the game and show the in-game menu. No problem there.

But if the button is held down longer, Android opens up the soft keyboard on the bottom half of the screen. Since it gets in the way, and is completely useless in this Activity, I would like to disable it.

I tried the following approaches.

Via InputMethodManager

From: Hide soft keyboard on activity without any keyboard operations

Since I have only one view (a GLSurfaceView) I tried this in my Activity.onCreate():

InputMethodManager imm = ((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE));
imm.hideSoftInputFromInputMethod(glSurfaceView.getApplicationWindowToken(), 0);

It doesn't work: the soft keyboard still comes up on Menu long-press.

Via the AndroidManifest.xml

From: How to stop the android soft keyboard from ever coming up in my entire application

I added this to my manifest:

<activity 
    android:windowSoftInputMode="stateAlwaysHidden"
>

Does a great deal of nothing as well.

So... is there even a way? How?

like image 816
Thomas Avatar asked Jan 13 '11 15:01

Thomas


2 Answers

Here is, at least, a solution to my immediate problem. It shows the in-game menu, no matter how long the button was pressed.

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_MENU) {
        event.startTracking();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {
    // From the docs:
    // "Note that in order to receive this callback, someone in the event [chain]
    // must return true from onKeyDown(int, KeyEvent) and call startTracking() on the event."
    if (keyCode == KeyEvent.KEYCODE_MENU) {
        // Override default handling, and don't pop up the soft keyboard.
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_MENU) {
        openOptionsMenu();
        return true;
    }
    return super.onKeyUp(keyCode, event);
}

But it feels like a hack, so I'm hoping that someone comes up with a better solution.

like image 177
Thomas Avatar answered Nov 15 '22 09:11

Thomas


But if the button is held down longer, Android opens up the soft keyboard on the bottom half of the screen.

What phone do you have? Are you sure? I've never once seen that happen and I just tried it and it doesn't work on my phone.

Also, that sounds like a user problem. Don't try to subvert the user. If the user REALLY wants to open a keyboard in your app, you should let them and if it's useless, they'll hit back and it will go away.

A more concerning issue should be that your buttons are so close to the menu buttons.

like image 41
Falmarri Avatar answered Nov 15 '22 08:11

Falmarri