Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Same fragments, edittext and requestfocus issue

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 :)

like image 917
DeliriumTremens Avatar asked Nov 28 '11 15:11

DeliriumTremens


1 Answers

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.

like image 126
tsmith Avatar answered Sep 23 '22 07:09

tsmith