Я хочу сфокусировать первое TextInputEditText
в макете и автоматически отображать экранную клавиатуру при отображении диалогового окна
Я нацеливаюсь на уровень API 28.
Компоновка:
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/d_add_edit_name_til"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/activity_vertical_margin"
android:layout_marginTop="@dimen/activity_vertical_margin"
android:layout_marginEnd="@dimen/activity_vertical_margin"
android:theme="@style/TextInputLayoutAppearance"
>
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/d_add_edit_name_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="User email"
android:imeOptions="actionDone"
android:inputType="textCapSentences"
android:singleLine="true"
android:focusableInTouchMode="true"
android:focusable="true"
>
<requestFocus />
</com.google.android.material.textfield.TextInputEditText>
</com.google.android.material.textfield.TextInputLayout>
DialogFragment
код:
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
final Dialog dialog = super.onCreateDialog(savedInstanceState);
dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
return dialog;
}
....
@Override
public void onResume(){
super.onResume();
int dialogWidth = Functions.convertDpToPixel(300,activity);
int dialogHeight = Functions.convertDpToPixel(250,activity);
new Handler().post(() -> {
getDialog().getWindow().setLayout(dialogWidth, dialogHeight);
});
}
Ответы от этой темы помогли мне решить проблему с API <28. </p>
Я знаю по документации по изменениям Android 9 , что:
Кроме того, действия больше неявно назначают начальный фокус в сенсорном режиме. Вместо этого вы можете явно запросить начальный фокус, если хотите.
Один из способов явного запроса начального фокуса (, как описано здесь ) заключается в добавлении тега <requestFocus />
внутри EditText
, но все еще безуспешно для уровня API 28 + DialogFragment
* Обратите внимание, что DialogFragment
из библиотеки andoridx (androidx.fragment.app.DialogFragment
)
Кто-нибудь еще имеет эту проблему?
Edit:
Единственный способ сделать эту работу - добавить следующий код в onViewCreated
:
new Handler().postDelayed(() -> {
nameEt.requestFocus();
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(nameEt, InputMethodManager.SHOW_IMPLICIT);
},200);
Я не считаю это правильным ответом, поскольку использование потоков таким образом делает код непредсказуемым. Все еще жду хорошего ответа