我希望能够在对话框显示时,将布局中的第一个 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的问题。
从Android 9版本更改文档中,我知道:
此外,活动不再在触摸模式下隐式分配初始焦点。相反,如果需要,您需要显式请求初始焦点。
其中一种显式请求初始焦点的方法(在这里讨论)是在EditText
中添加<requestFocus />
标签,但是对于API级别28和DialogFragment
仍然没有成功。
*请注意,DialogFragment
来自andoridx库(androidx.fragment.app.DialogFragment
)
还有其他人遇到这个问题吗?
编辑:
我唯一成功的方法是在onViewCreated
添加以下代码:
new Handler().postDelayed(() -> {
nameEt.requestFocus();
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(nameEt, InputMethodManager.SHOW_IMPLICIT);
},200);
我认为这不是一个有效的答案,因为在这种方式下使用线程会使代码变得不可预测。仍在等待好的答案。
onShowListener
中尝试使用此代码。 - ADM