Android AlertDialog.Builder中编辑文本的自动键盘显示
很抱歉问了一个以前似乎已经问过和回答过的问题,但我发现没有一个解决方案对我有效。我正在创建一个带有编辑文本的AlertDialog,以从用户处获取字符串。显示此对话框时,没有可见的软键盘,只有当用户点击编辑文本时,键盘才会弹出。如何使EditText自动聚焦,并使键盘在显示对话框时自动显示 下面是我创建和显示对话框的代码。所有这些都在主活动按钮的OnClickListener中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
@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开发是多么复杂!我不可能是唯一一个觉得这非常令人沮丧的人。您可能会认为显示文本对话框是一个相当直接的问题,但事实恰恰相反。我必须在类内实现监听器,在类内实现监听器。毫不奇怪,我有所有这些范围和静态/非静态问题。我不确定我是否理解您所说的“将应用程序活动发送到适配器”是什么意思。你介意解释一下吗,也许这是如何应用到我最上面的代码块中的?