相同的片段,编辑文本和请求焦点问题

8

很抱歉再次向您寻求关于此事的帮助,但所有其他帖子都没有帮助。

以下是情景:我有一个包含片段的布局的活动('A')。这个片段会根据用户输入进行更换。其中一个片段内有一个编辑框,我想在创建时将其聚焦并显示软键盘。因此,在片段的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);

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

我也绝望地思考了一个活动/片段问题,并在活动上使用了相同的监听器技术,但没有成功。

非常沮丧,请帮忙 :)


当我在XML布局中看到<RequestFocus/>标签时,我发现了一个类似的问题。 - ruX
1个回答

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

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

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


这是神奇的 dispatchTouchEvent,现在在 onClick 中你需要对 View 进行 requestFocus()。非常感谢! - Benny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接