Sorry for asking another time help on this matter, but all others posts didn't help.
Here's the scenario: I have a Acivity ('A') that incorporates a Layout with a fragment inside. This fragment is swapped on user input. One of this fragments has a edittext inside, which I want to get focus on creation AND show the damn soft keyboard. So, in the onCreateView() of the fragment I use:
mEt = (EditText) v.findViewById(R.id.et);
mEt.setImeOptions(EditorInfo.IME_ACTION_DONE);
mEt.requestFocus();
So, it works the first time, but if the fragment is replaced and re-created later, it gets the focus but the keyboard does not appear.
I tried to hide keyboard before the fragment is destroyed via:
InputMethodManager keyboard = (InputMethodManager)
ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.hideSoftInputFromWindow(et.getWindowToken(), 0);
or to explicit show the keyboard via:
InputMethodManager keyboard = (InputMethodManager)
ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.showSoftInput(et, 0);
but (as you can imagine by the fact I'm posting here :) ), the problem stay.
I also desperatly thought about a activity/fragment problem and used same techniques with listeners on the activity, without luck.
Quite frustrated, please help :)
I just solved this problem. We had an activity that swapped out multiple Fragments with text fields that needed focus and the keyboard.
There are two ways to solve this, both of which I played with. This is the method I finally went with.
@Override
private View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
...
if (savedInstanceState != null && !savedInstanceState.isEmpty()){
msDialogMessage = savedInstanceState.getString(STATE_DAILOG_MSG);
} else{
Utils.setKeyboardFocus(mEditTextUserName);
}
...
}
/**
* Used to set focus and show keyboard (if needed) for a specified text field
* @author Ty Smith
* @param primaryTextField
*/
public static void setKeyboardFocus(final EditText primaryTextField) {
(new Handler()).postDelayed(new Runnable() {
public void run() {
primaryTextField.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 0, 0, 0));
primaryTextField.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));
}
}, 100);
}
Although if your fragments don't play nice and the lifecycle methods aren't calling right, you might consider my other way.
I won't post code, but just put the grab focus method in a custom listener and call it from the activity when you put the fragment to the front.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With