当将AlertDialog.Builder与EditText一起使用时,软键盘不会弹出


117

我使用AlertDialog.Builder来创建一个输入框,使用EditText作为输入方法。

不幸的是,尽管EditText成为焦点,但软键盘不会弹出,除非您再次明确触摸它。

有办法强迫它弹出吗?

在(AlertDialog.Builder).show();之后,我尝试了以下方法 但无济于事。

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

有人可以帮忙吗?

谢谢!!


1
请格式化您的源代码。
菲利普,2012年

然后,我也支持您:)我在多个小时内搜索了相同的问题,而grine4ka的最后一个答案效果很好
philipp

Answers:


222

我做了这样的事情

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

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

dialog.show();

3
非常感谢。我已经搜索了一段时间,这就是您要使用的方式。所有的OnFocusChangeListener方法对我来说似乎都很重要,并且会造成麻烦。你必须创建AlertDialogAlertDialog.Builder
菲利普,2012年

这真的是一种解决方案吗?不管是否有输入字段,这都将强制键盘显示,无论输入字段是否具有焦点,对不对?=)
Ted

@Ted你是对的,这不是真正的解决方案,但是它可以工作。如果对话框中没有edittext,并且没有出现软键盘,我就尝试执行此操作。
grine4ka

1
我实际上设法“解决了它”(解决方法)。我将setOnFocusChangeListener用于EditText,并在onFocusChange中是否检查其是否具有焦点(“ hasFocus”变量),如果是,则执行getWindow()。setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Ted

1
注:对于这个工作,你需要把setSoftInputMode线之前 dialog.show()或将无法正常工作。+1为简单正确的解决方法顺便说一句
Spikatrix

29

我设法解决了这个问题:

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);

23

我发现相同的代码在Tablet上可以正常工作,键盘会弹出,但在Phone上却不能,因此进一步研究似乎指向“调整”选项。

我正在使用它,感觉更清洁。

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

谢谢。这比使用更好SOFT_INPUT_STATE_ALWAYS_VISIBLE。就像SOFT_INPUT_STATE_ALWAYS_VISIBLE将阻止对话框的UI组件一样,可以在其中SOFT_INPUT_ADJUST_RESIZE调整对话框的大小并“向上推”对话框。
Cheok Yan Cheng

10

就我而言,显示对话框时,我能够显示键盘的唯一方法是添加到我的键盘上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();
}

请注意SOFT_INPUT_STATE_ALWAYS_VISIBLE而不是SOFT_INPUT_STATE_VISIBLE

从文档:

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

这是唯一对我有用的解决方案,我尝试了对它们的加载。我的是来自alertdialog构建器的dialogfragment生成。重要的一点似乎是将上面的代码放在onResume()中。在其他任何地方都行不通!
user960914 '18

6

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

你应该把代码放在这里

    @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);
         }
       }
    });

}

5

这里给出一个更好的解决方案。

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

没有解决方法。EditText表现正常。


这对我有用,另一种解决方案引起了人们的注意,但是键盘未显示。
阿克瑟伊,

2
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);

1

已经在这里回答了。使用OnFocusChangeListener为我工作。


该问题询问如何为AlertDialog.Builder对象设置软输入模式,但是您引用的线程提供了一个使用AlertDialog对象的示例。如果我尝试使用建议的代码(在OnFocusChangeListener中使用alert.getWindow()。setSoftInputMode(...))Eclipse对象,则没有为AlertDialog.Builder类型定义方法getWindow()。您能帮我解决这个问题吗?
prepbgg

1

就我而言,当我设置它时(在创建对话框之前(创建它之后)),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);
}

我希望这对遇到我同样问题的人有所帮助。


0

试试这个,对我有用

如果要显示软键盘:

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);

0
final AlertDialog.Builder alert = new AlertDialog.Builder(context);

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

1
最好在代码中包含一些上下文/解释,因为这会使答案对于OP和将来的读者更加有用。
EJoshuaS-恢复莫妮卡

0

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

https://developer.android.com/reference/androidx/appcompat/app/AlertDialog.Builder

AlertDialog类负责根据对话框中是否有任何视图从View.onCheckIsTextEditor()返回true来自动为您设置android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM。

您需要清除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);
}

或者,如果不使用DialogFragment,则可以使用Dialog.setOnShowListener。

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    }
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.