I have been working on the soft keyboard used in our apps. The general idea
is this -- create an EditText over a certain area of the screen, then
requestFocus() on it. In the onFocusChange() callback the actual call to
showSoftInput() is made. The keyboard appearance is standardized by
subclassing EditText, with the only goal -- to override
onCreateInputConnection() and set .imeOptions =
EditorInfo.IME_FLAG_NO_EXTRACT_UI.
This works decent in 3.0+ (some hickups related to onStop/onStart cycles,
but otherwise ok), however in 2.3 this approach displays absolutely bizarre
behavior. The first time the EditText is created, I get no keyboard (I do
get focus to the EditText however, and can back out with the back button).
The EditText region does not react to touches either (the first time
around). *However*, if this routine is repeated -- a new EditText with
identical parameters, everything works as expected! I have tried every
possible combination of various forms of showSoftInput, toggleSoftInput,
tried clearing focus before requesting it, tried doing all these things
with delays introduced, tried setting
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE flags, so on and
so forth -- basically every approach I could google.
I am happy to say, that I finally arrived at a solution, but why it works
as it does is beyond me. *I was hoping that some of you could shed some
light on this.* My other goal is to get this 'fix' into the wild, as I am
sure others can benefit from it, based on the amount of unanswered
questions re: showing soft keyboard on stackoverflow and elsewhere. The
secret sauce is in the onFocusChange callback, so I will only list this
part of the code in the interest of brevity.
Upon examining the code fragment below, you will notice that simply
showing-then-hiding the keyboard gets rid of the bizarre behavior, and does
not seem to affect functionality otherwise (as far as I can tell). Note
that doing only the show or only the hide does not have the desired effect
(ie, problem remains). Only doing the pair back-to-back restores desired
functionality. My wild guess is that it may have something to do with the
window's focus (as opposed to the EditText's). Any thoughts on this matter
are welcome.
----------------------------------------------------------------------------
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
// -- THIS IS THE SECRET
mInpMgr.showSoftInput(mKeyboardTriggerView,
InputMethodManager.SHOW_FORCED);
mInpMgr.hideSoftInputFromWindow(mKeyboardTriggerView.getWindowToken(), 0);
// -- need to delay, otherwise doesn't show up when doing
start/stop cycles
mKeyboardTriggerView.postDelayed(new Runnable() {
@Override
public void run() {
mInpMgr.showSoftInput(mKeyboardTriggerView,
InputMethodManager.SHOW_FORCED);
}
},150);
} else {
mInpMgr.hideSoftInputFromWindow(mKeyboardTriggerView.getWindowToken(), 0);
}
}
-------------------------------------------------------------------------
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en