显示对话框的软键盘


76

我正在显示一个带有edittext视图的对话框。但是,仅当用户在editview中按下时,软键盘才会打开。因此,我尝试使用以下代码调用InputMethodManager。

InputMethodManager imm =
 (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(dialogField,0);

dialogField是输入字段。但是,我到底应该在什么时候这样做呢?我在对话框的onStart()方法中尝试过,但没有任何反应。我也尝试过为dialogField请求焦点,但这没有任何改变。

我也尝试过这段代码

dialogField.setOnFocusChangeListener(new View.OnFocusChangeListener()
{
    public void onFocusChange (View v, boolean hasFocus)
    {
        if (hasFocus)
        {
            Main.log("here");
            dialogInput.getWindow().setSoftInputMode(
              WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            /*
                InputMethodManager mgr =
                  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                mgr.showSoftInput(dialogField,0);
            */
        }
    }
});

在两个版本中。但是没有软键盘想要出现。Main.log只是一个日志,它向我显示该函数实际上已被调用。是的,它被称为。

在对话框打开之前,我可以使用SHOW_FORCED标志获取键盘。但是,它不会在退出时关闭。在显示对话框之前,我只能这样做。在任何回调中,它也不起作用。


您是否尝试过SHOW_IMPLICIT标志?
Telmo Marques

1
这是我过度努力的工作,但无法正常工作。
托马斯

是的,我尝试了SHOW_IMPLICIT标志。该文档确切说,如果希望用户为TextEdit输入内容,则应调用showSoftInput。但是如何?
Rene

这是在这里回答的,对我来说很棒。
肖恩·劳松

Answers:


183

令人敬畏的问题,我也尝试这样做,并找到了解决方案。

使用对话框生成器类,AlertDialog.Builder您将必须像这样调用对话框:

AlertDialog.Builder builder = new AlertDialog.Builder();
AlertDialog dialog;

builder.set...

dialog = builder.create();
dialog.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
dialog.show();

这对我来说很好。

注意:您必须import android.view.WindowManager.LayoutParams;在那里输入常量值。


1
我确实想知道这将如何影响对话框关闭后的窗口行为...让我们不要忘记窗口也包含对话框和您的活动
Alex.F 2015年

4
对于具有相同问题的任何人,setSoftInputMode()必须先致电show()
阿巴斯(Abbas)

2
对我来说就是使用“ SOFT_INPUT_STATE_ALWAYS_VISIBLE”
abbasalim

2
哇,非常感谢!我们可以向SO添加捐款或捐款按钮以表示感谢吗?
JoelBroström'18年

1
最后一个答案!对于想在自定义对话框类中使用它的任何人,只需getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);onCreate()方法中进行调用即可。
Nekomajin42年

14
 AlertDialog dialog = new AlertDialog.Builder(this).create();
    dialog.show();
    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
老兄,你真了不起!那条windows.cl3wrFlags行很重要。我检查了每个SO答案,但在其他任何地方都没有提到该行。谢啦!
FreakyLearner

6

科特林

这是经过测试的代码。

val dialog = AlertDialog.Builder(requireContext()).apply {
    setTitle(…)
    setView(editText)
    setPositiveButton(…)
    setNegativeButton(…)
}
val window = dialog.show().window
window?.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)

确保您windowshow()方法访问属性。获得windowcreate()方法回来null对我来说,这样的键盘并没有显示。

AlertDialog从导入androidx.appcompat.app.AlertDialogWindowManager从导入android.view


0

与Kotlin对话的片段

覆盖onStart方法

override fun onStart() {
    super.onStart()
    dialog.window?.
    setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE
    )
}

如果您想在关闭后关闭,请使用以下代码覆盖关闭方法

override fun onDismiss(dialog: DialogInterface?) {
val inputMethodManager = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_IMPLICIT_ONLY)
}
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.