Я создаю фрагмент диалога, используя AlertDialog.Builder. Я хочу, чтобы у него был только один EditText, чтобы захватить некоторый ввод текста пользователя. Он работает нормально, но клавиатура IME не появляется, как только отображается диалог. EditText уже выбран, но пользователь снова должен нажать EditText, чтобы открыть клавиатуру IME:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
EditText input = new EditText(getActivity());
return new AlertDialog.Builder(getActivity())
.setView(input)
.create();
}
не должно ли оно появляться самостоятельно немедленно?
благодаря
Нет, видимо, это не поведение по умолчанию. Если вы действительно хотите, чтобы клавиатура появлялась автоматически, имитируйте "нажатие" внутри вашего EditText
, вот что сработало для меня (это безопаснее, чем вызов showSoftInput
из-за ненадежного поведения requestFocus
, плюс вам не нужно микроуровневать клавиатуру):
EditText tv = (EditText)findViewById(R.id.editText);
tv.post(new Runnable() {
@Override
public void run() {
Log.d("RUN", "requesting focus in runnable");
tv.requestFocusFromTouch();
tv.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , tv.getWidth(), tv.getHeight(), 0));
tv.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , tv.getWidth(), tv.getHeight(), 0));
}
});
Я думаю, что причина, по которой клавиатура не открывается, заключается в том, что пользователь должен иметь возможность увидеть все окно, прежде чем решать, где начать редактирование в первую очередь.
попробуй это:
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE))
.showSoftInput(viewToEdit, 0);