很抱歉再次请求帮助解决此问题,但所有其他帖子都没有帮助。
这是一个场景:我有一个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);
但是(正如我可以想象的那样,我在这里发帖:)),问题仍然存在。
我也绝望地想到了一个活动/片段问题,并且在活动中使用与听众相同的技术,没有运气。
非常沮丧,请帮助:)
答案 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);
}
虽然如果你的片段不好玩且生命周期方法没有正确调用,你可能会考虑我的另一种方式。
我不会发布代码,只是将抓取焦点方法放在自定义侦听器中,并在将片段放到前面时从活动中调用它。