ChatGPT解决这个技术问题 Extra ChatGPT

我正在显示一个带有 edittext 视图的对话框。但是,只有当用户在编辑视图内按下时,软键盘才会打开。所以我尝试使用以下代码调用 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 标志?
这是我一直在努力解决但无法正常工作的问题。
是的,我尝试了 SHOW_IMPLICIT 标志。文档准确地说,如果希望用户为 TextEdit 进行输入,您应该调用 showSoftInput。但是怎么做?
这得到了回答 here,它对我很有用。

S
SparK

很棒的问题,我也试图这样做并找到了解决方案。

使用对话框构建器类 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;


我确实想知道这将如何影响对话框关闭后的窗口行为......我们不要忘记窗口也包含对话框和您的活动
对于有相同问题的任何人,请注意必须在 show() 之前调用 setSoftInputMode()
对我来说,使用“SOFT_INPUT_STATE_ALWAYS_VISIBLE”
哇,非常感谢!我们可以向 SO 添加捐赠或贡献按钮以表示感谢吗?
终于有答案了!对于想要从自定义对话框类使用它的任何人,只需从 onCreate() 方法调用 getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
d
duranun
 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);

哥们你太棒了! windows.cl3wrFlags 行很重要。我已经检查了每个 SO 答案,并且在其他任何地方都没有提到该行。谢啦!
请注意,在 Android 4-8 上调用 dialog.getWindow().setSoftInputMode() after dialog.show() 会产生令人讨厌的副作用:配置更改后对话框仍保留在屏幕上,仍与已销毁的 Activity/Fragment 相关联。
当您有一个列表、寻呼机或其他在对话框上使用适配器(嵌套编辑文本)的视图时,AlertDialog 将设置这些标志,因此不会触发软输入。只需清除标志并设置软输入模式即可。
Y
Yogesh Umesh Vaity

科特林

这是经过测试的代码。

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)

确保从 show() 方法访问 window 属性。从 create() 方法获取 window 为我返回 null,所以键盘没有显示。

androidx.appcompat.app.AlertDialog 导入 AlertDialog。从 android.view 导入 WindowManager


R
Ritesh Niwane

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

N
Na Pro

这是我的解决方案,它适用于对话。

txtFeedback.requestFocus();
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

也许您还需要将其添加到 AndroidManifest.xml 中的活动标记中,以便在关闭对话框时关闭键盘。

android:windowSoftInputMode="stateAlwaysHidden"

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅