Android AlertDialog.Builder中编辑文本的自动键盘显示

Android AlertDialog.Builder中编辑文本的自动键盘显示,android,android-edittext,android-softkeyboard,android-alertdialog,Android,Android Edittext,Android Softkeyboard,Android Alertdialog,很抱歉问了一个以前似乎已经问过和回答过的问题,但我发现没有一个解决方案对我有效。我正在创建一个带有编辑文本的AlertDialog,以从用户处获取字符串。显示此对话框时,没有可见的软键盘,只有当用户点击编辑文本时,键盘才会弹出。如何使EditText自动聚焦,并使键盘在显示对话框时自动显示 下面是我创建和显示对话框的代码。所有这些都在主活动按钮的OnClickListener中 @Override public void onClick(View v) { final EditText

很抱歉问了一个以前似乎已经问过和回答过的问题,但我发现没有一个解决方案对我有效。我正在创建一个带有编辑文本的AlertDialog,以从用户处获取字符串。显示此对话框时,没有可见的软键盘,只有当用户点击编辑文本时,键盘才会弹出。如何使EditText自动聚焦,并使键盘在显示对话框时自动显示

下面是我创建和显示对话框的代码。所有这些都在主活动按钮的OnClickListener

@Override
public void onClick(View v) {
    final EditText textFileName = new EditText(MainActivity.this);
    textFileName.setRawInputType(Configuration.KEYBOARD_QWERTY);
    textFileName.setInputType(InputType.TYPE_CLASS_TEXT);

    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this)
    .setTitle("Save Data")
    .setMessage("Specify file name for saved data.")
    .setView(textFileName)
    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            // Do the file saving bit here
        }
    })
    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            // Do whatever you feel is important here
        }
    });
    AlertDialog dialog = builder.create();
    dialog.show();
}
现在我确实到处寻找这个问题的解决方案,找到了两个答案,然后。这两张海报看起来都很满意,但它们都不适合我,我就是不知道我做错了什么

这是我的第一次尝试,基于上面的代码和第一个链接中公布的最受欢迎的答案

@Override
public void onClick(View v) {
    final EditText textFileName = new EditText(MainActivity.this);
    textFileName.setRawInputType(Configuration.KEYBOARD_QWERTY);
    textFileName.setInputType(InputType.TYPE_CLASS_TEXT);

    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this)
    .setTitle("Save Data")
    .setMessage("Specify file name for saved data.")
    .setView(textFileName)
    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            // Do the file saving bit here
        }
    })
    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            // Do whatever you feel is important here
        }
    });
    AlertDialog dialog = builder.create();
    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    dialog.show();
}
它本质上是在dialog.show()调用之前添加的一行代码,但没有任何更改。对话框仍然弹出最漂亮的编辑文本,但没有键盘,直到我点击编辑文本

这是第二次尝试,基于第二个链接中投票最多的答案

@Override
public void onClick(View v) {
    final EditText textFileName = new EditText(MainActivity.this);
    textFileName.setRawInputType(Configuration.KEYBOARD_QWERTY);
    textFileName.setInputType(InputType.TYPE_CLASS_TEXT);
    textFileName.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            textFileName.post(new Runnable() {
                @Override
                public void run() {
                    InputMethodManager inputMethodManager = (InputMethodManager)MainActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.showSoftInput(textFileName, InputMethodManager.SHOW_IMPLICIT);
                }
            });
        }
    });
    textFileName.requestFocus();

    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this)
    .setTitle("Save Data")
    .setMessage("Specify file name for saved data.")
    .setView(textFileName)
    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            // Do the file saving bit here
        }
    })
    .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            // Do whatever you feel is important here
        }
    });
    AlertDialog dialog = builder.create();
    dialog.show();
}
和以前一样的故事

需要帮忙吗?非常感谢。

试试这个,它可以帮助我:

editText.postDelayed(new Runnable() {
    @Override
    public void run() {
        InputMethodManager keyboard = (InputMethodManager) activity
            .getSystemService(Context.INPUT_METHOD_SERVICE);
        keyboard.showSoftInput(editText, 0);
    }
}, 50);

在该.getSystemService调用中,我收到一个“无法从类型中静态引用非静态方法getSystemService(String)”错误。不知道为什么,因为我的任何类或函数都不是静态的,但上面的方法不起作用。不幸的是,我不能将所有的类或函数都放入允许注释的600个字符中,但是,如果你看一下我在问题中的原始代码,我已经在文本文件名.setInputType(InputType.TYPE_CLASS_TEXT)这一行的下面添加了这个部分;textFileName.postDelayed(new Runnable(){@Override public void run(){InputMethodManager键盘=(InputMethodManager)MainActivity.getSystemService(Context.INPUT_方法_服务);keyboard.showSoftInput(editText,0);}},50);我在MainActivity.getSystemService(Context.INPUT\u METHOD\u SERVICE)位上得到了错误。很抱歉代码格式很难看,但我不知道如何在注释中整理它。关于你的建议还有一个问题:活动关键字到底是什么意思?我假设它指的是当前的活动,在我的例子中称为MainActivity,所以您会注意到,我已将代码中所有出现的editText替换为我的textFileName,将activity替换为MainActivity。这很可能是我弄错的地方?是的,我将应用程序活动发送到适配器,然后只使用该代码,它工作得很好:final EditText editbet=(EditText)dialog.findViewById(R.id.dialogEditText);editbet.requestFocus();editbet.post(new Runnable(){@Override public void run(){InputMethodManager键盘=(InputMethodManager)活动.getSystemService(Context.INPUT_方法_服务);keyboard.showSoftInput(editbet,0);});天哪,我真不敢相信Android开发是多么复杂!我不可能是唯一一个觉得这非常令人沮丧的人。您可能会认为显示文本对话框是一个相当直接的问题,但事实恰恰相反。我必须在类内实现监听器,在类内实现监听器。毫不奇怪,我有所有这些范围和静态/非静态问题。我不确定我是否理解您所说的“将应用程序活动发送到适配器”是什么意思。你介意解释一下吗,也许这是如何应用到我最上面的代码块中的?