gpt4 book ai didi

android - DialogFragment 将 EditText 聚焦在为 API 28 打开的对话框上

转载 作者:行者123 更新时间:2023-11-29 23:07:53 29 4
gpt4 key购买 nike

我要关注第一个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);
});
}

答案来自this thread帮助我解决了 API < 28 的问题。

我从Android 9 changes documentation知道那:

Additionally, activities no longer implicitly assign initial focus in touch-mode. Instead, it is up to you to explicitly request initial focus, if desired.

显式请求初始焦点 (as discussed here) 的方法之一是添加 <requestFocus />标签内 EditText , 但 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);

我不认为这是一个有效的答案,因为以这种方式使用线程会使代码变得不可预测。还在等一个好的答案

最佳答案

使用 OnGlobalLayoutListener 代替 Handler:

nameEt.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener{
override fun onGlobalLayout() {
nameEt.viewTreeObserver.removeOnGlobalLayoutListener(this)
nameEt.requestFocus()
}
})

在这种情况下,您不需要额外的显式调用 dialog.getWindow().setSoftInputMode(..)

关于android - DialogFragment 将 EditText 聚焦在为 API 28 打开的对话框上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56342361/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com