Same fragments, edittext and requestfocus issue

元气小坏坏 提交于 2019-12-05 23:39:34

问题


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


回答1:


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.



来源:https://stackoverflow.com/questions/8298399/same-fragments-edittext-and-requestfocus-issue

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!