我想使布局的第一个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知道:
此外,活动不再以触摸方式隐式分配初始焦点。相反,您可以根据需要明确请求最初的关注。
显式请求初始焦点(as discussed here)的方法之一是在<requestFocus />
内添加EditText
标记,但API级别28 + DialogFragment
仍然没有成功< / p>
*请注意,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);
我不认为这是一个有效的答案,因为以这种方式使用线程会使代码不可预测。还在等待一个好的答案
答案 0 :(得分:1)
EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);
答案 1 :(得分:0)
TextInputEditText textInputEditText= (TextInputEditText) findViewById(R.id.d_add_edit_name_et);
textInputEditText.requestFocus();