相同的片段,edittext和requestfocus问题

时间:2011-11-28 15:48:53

标签: android android-edittext android-fragments

很抱歉再次请求帮助解决此问题,但所有其他帖子都没有帮助。

这是一个场景:我有一个Acivity('A'),它包含一个带有片段的Layout。此片段在用户输入上交换。其中一个片段里面有一个edittext,我想把重点放在创作上并显示该死的软键盘。所以,在我使用的片段的onCreateView()中:



                mEt = (EditText) v.findViewById(R.id.et);
                mEt.setImeOptions(EditorInfo.IME_ACTION_DONE);
                mEt.requestFocus();

所以,它第一次工作,但如果片段被替换并在以后重新创建,它会获得焦点,但键盘不会出现。

我试图在片段被销毁之前隐藏键盘:



        InputMethodManager keyboard = (InputMethodManager)
        ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
        keyboard.hideSoftInputFromWindow(et.getWindowToken(), 0);

或通过以下方式明确显示键盘:



            InputMethodManager keyboard = (InputMethodManager)
                ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
            keyboard.showSoftInput(et, 0);

但是(正如我可以想象的那样,我在这里发帖:)),问题仍然存在。

我也绝望地想到了一个活动/片段问题,并且在活动中使用与听众相同的技术,没有运气。

非常沮丧,请帮助:)

1 个答案:

答案 0 :(得分:16)

我刚刚解决了这个问题。我们有一个活动,它将多个片段换成需要焦点和键盘的文本字段。

有两种方法可以解决这个问题。这是我最终采用的方法。

@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);
 }

虽然如果你的片段不好玩且生命周期方法没有正确调用,你可能会考虑我的另一种方式。

我不会发布代码,只是将抓取焦点方法放在自定义侦听器中,并在将片段放到前面时从活动中调用它。