使用 AlertDialog.Builder 和 EditText 时,软键盘不会弹出

我使用 AlertDialog 生成器来创建一个输入框,使用 EditText 作为输入方法。

不幸的是,软键盘不会弹出,虽然 编辑文本是在焦点,除非你明确地再次触摸它。

有办法让它爆炸吗?

我试过以下方法,在(AlertDialog.Builder.show ()之后;,但没有用。

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(input, InputMethodManager.SHOW_FORCED);

有人能帮忙吗?

谢谢!

47920 次浏览

This was answered 给你 already. Using an OnFocusChangeListener worked for me.

调用 showDialog()以显示在 onCreateDialog()中使用 AlertDialog创建的对话框时

你应该把代码放在 onPrepareDialog():

@Override
protected void onPrepareDialog (int id, Dialog dialog, Bundle args)
{
TextView editText=(TextView) dialog.findViewById(R....);


editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
}
});
}

我创造了这样的东西

AlertDialog.Builder b = new AlertDialog.Builder(this);//....
AlertDialog dialog = b.create();


dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);


dialog.show();

给出了一个更好的解决方案 给你

dialog.getWindow().clearFlags(
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

没有变通方案。 EditText的表现与预期一致。

我设法解决了这个问题:

Dialog = builder.create();
Dialog.show();
Dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

我发现同样的代码在平板电脑上正常工作,键盘会弹出,但在手机上不会,所以进一步研究,似乎指向“调整”选项。

我在用这个,感觉干净多了。

AlertDialog d = builder.create();
d.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
d.show();

试试这个,对我有用

如果你想显示软键盘:

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(input.getWindowToken(), 0);

如果你想隐藏它:

  InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
Window window = dialog.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
final AlertDialog.Builder alert = new AlertDialog.Builder(context);


final AlertDialog dialog = alert.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

在我的情况下,我能够显示键盘时,对话框显示的唯一方法是添加到我的 DialogFragment:

@Override
public void onResume() {
super.onResume();
getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
myEditText.requestFocus();
}

注意 可见而不是 可见

来自文档:

// Visibility state for softInputMode: please always make the soft input
// area visible when this window receives input focus.
int SOFT_INPUT_STATE_ALWAYS_VISIBLE;

在我的例子中,当我设置 SoftInputMode 时,在显示对话框之前(创建对话框之后)它并没有显示出来。下面的代码对我很有用,我在显示对话框之后设置了 SoftInputMode。

科特林:

val dialog = MaterialAlertDialogBuilder(context) // Other builder code
.create()
dialog.show()
dialog.window?.apply { // After the window is created, get the SoftInputMode
clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
}

Java:

AlertDialog dialog = MaterialAlertDialogBuilder(getContext()) // Other builder code
.create();
dialog.show();
Window window = dialog.getWindow();
if(window != null){ // After the window is created, get the SoftInputMode
window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

我希望这能帮助和我有同样问题的人。

在调用 AlertDialog.onCreate 之后添加 EditText 时发生此问题。

Https://developer.android.com/reference/androidx/appcompat/app/alertdialog 建筑工人

AlertDialog 类负责自动设置 视图. WindowManager. LayoutParams.FLAG _ ALT _ FOCUSABLE _ IM 基于对话框中的任何视图是否从 OnCheckIsTextEditor ().

您需要清除 FLAG _ ALT _ FOCUSABLE _ IM 标志。

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

因为 AlertDialog.show 在 DialogFragment.onStart 中被调用,所以可以在 DialogFragment.onStart 中插入代码。

@Override
public void onStart() {
super.onStart();
getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

Or you can use the Dialog.setOnShowListener if you do not use a DialogFragment.

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}
});

Try this, its working for me

    Window window = dialog.getWindow();
if (window != null) { // After the window is created, get the SoftInputMode
window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

我找到了一个简单可靠的解决方案,只需要在你的对话框布局的根目录中放置一个隐藏的 EditText,如果你得到了一个复杂的布局,而这个复杂的布局中没有一个可编辑的字段,

<!-- Just to trick AlertDialog to not hide soft keyboard -->
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />

这基本上是为了欺骗 compat/androidx 的 这部分

I used to use onResume solution above but with that I couldn't use simpler API of AlertDialog.Builder() to remove the use of AppCompatDialogFragment but now I can simply use the easier API.