Can I use the soft keyboard without an EditText?

2019-02-06 07:44发布

问题:

I'm creating a simple typing game in Android. I have no problem getting input from the physical keyboard, but now I'm trying to get the soft keyboard to appear without the EditText. So far, I've tried the following:

1. EditText with visibility="invisible" and this line:

((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(keyboard_edittext, InputMethodManager.SHOW_FORCED); // SHOW_IMPLICIT also failed

2. This line in the onCreate():

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

This method actually displayed an empty white box across the bottom 10% of the screen but not the keyboard, although when I run it now it does nothing.

3. Another two lines in the onCreate():

InputMethodManager m = (InputMethodManager)this.getSystemService (Context.INPUT_METHOD_SERVICE); m.toggleSoftInput(0, InputMethodManager.SHOW_IMPLICIT);

No luck on any of these. Is it even possible to display the soft keyboard (and then use onKeyUp/onKeyDown) without focusing on an EditText?

Right now, the only way I can see is to approach this is to create my own implementation of the soft keyboard (i.e. build it from scratch). Not looking forward to that!

回答1:

The following code works for me:

 InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
 imm.toggleSoftInput (InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

I use this code in a onKeyUp handler when I press the "menu" button.



回答2:

Instead of using visibility="invisible" you can set android:alpha="0" on your EditText. So you still need a EditText but it is not visible and you can get the input from the softkeyboard by an onKeyListener()



回答3:

You can force the Softkeyboard to be shown by using:


InputMethodManager im = (InputMethodManager)getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
im.showSoftInput(myView, InputMethodManager.SHOW_FORCED);



回答4:

Make sure to enable the soft keyboard for your view:

setFocusable(true);
setFocusableInTouchMode(true);

Then call:

InputMethodManager mgr = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT);


回答5:

Note that if you are working in landscape mode, the soft input will create its own text input field ruining all your hard work. You can prevent this behavior:

// This makes us remain invisible when in landscape mode.
setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);

Now if you have set up an invisible EditText it will remain as you made it.