当AlertDialog.Builder对象打开时显示软键盘

我打开一个input对话框的代码如下所示:

final AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle("Dialog Title"); alert.setMessage("Request information"); LayoutInflater factory = LayoutInflater.from(this); final View textEntryView = factory.inflate(R.layout.edittextautotextlayout, null); final EditText inputBox = (EditText) textEntryView.findViewById(R.id.my_et_layout); alert.setView(inputBox); 

这工作正常,除了我必须在软键盘出现之前点击文本input行。

遵循这里给出的build议,我尝试插入:

 inputBox.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { alert.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } } }); 

但是Eclipse对象“没有为AlertDialog.Buildertypes定义方法getWindow()”。

看起来setOnFocusChangeListener代码适用于AlertDialog对象,但不适用于AlertDialog.Builder。 我应该如何修改我的代码以使软键盘自动出现。

Solutions Collecting From Web of "当AlertDialog.Builder对象打开时显示软键盘"

只要你一直需要在对话框打开的时候立即显示键盘,而不是一旦特定的表单控件获得焦点(例如,如果你的对话框只显示一个EditText和一个button),你可以执行以下操作:

 AlertDialog alertToShow = alert.create(); alertToShow.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); alertToShow.show(); 

您不必立即在构build器上调用.show() ,而是可以调用.create() ,它允许您在显示在屏幕上之前对其进行一些额外的处理。

这是对miannelle的回应。

select菜单选项时将调用以下方法:

 private void addNote() { final Dialog dialog = new Dialog(this); dialog.setContentView(R.layout.textentryalertdialog); dialog.setTitle("Add note"); TextView msgText = (TextView) dialog.findViewById(R.id.messagetext); msgText.setText("Whatever prompt you want"); final EditText inputLine = (EditText) dialog.findViewById(R.id.my_edittext); Button okButton = (Button) dialog.findViewById(R.id.OKButton); okButton.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { dialog.dismiss(); // app specific code } }); Button cancelButton = (Button) dialog.findViewById(R.id.CancelButton); cancelButton.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { dialog.dismiss(); } }); dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); dialog.show(); } 

textentryalertdialog.xml文件定义了一个线性布局

TextView android:id =“@ + id / messagetext”…

EditText android:id =“@ + id / my_edittext”…

buttonandroid:id =“@ + id / OKButton”…

Button android:id =“@ + id / CancelButton”…

我希望这有帮助。

在Mur Votema的鼓励下(见上面的答案),我通过build立一个基于Dialog类的自定义对话框来回答我的问题。 与基于AlertDialog.Builder的警报不同,自定义对话框不接受getWindow()。setSoftInputMode(…)命令,因此可以自动显示软键盘。

有关构build自定义对话框的指导,我发现这个网页 , 这特别有帮助。

如果你想popup对话框和软键盘一样,那么用户可以在对话框中点击编辑文本来显示键盘,例如,如果你要从对话框中取一些值,那么使用这个简单的代码,它会解决你的问题。

  public void onClick(final View v) { AlertDialog.Builder alert = new AlertDialog.Builder(v.getContext()); alert.setIcon(R.drawable.smsicon); alert.setTitle(" Secrete Code"); alert.setMessage("Enter a Key for secrete text !"); final EditText shft_val = new EditText(v.getContext()); shft_val.setInputType(InputType.TYPE_CLASS_NUMBER);//changing the keyBoard to No only,restrict the string etc alert.setView(shft_val); //pOp Up the key pad on Edit Text focus event shft_val.setOnFocusChangeListener(new OnFocusChangeListener() { public void onFocusChange(View arg0, boolean arg1) { InputMethodManager inputMgr = (InputMethodManager)v.getContext(). getSystemService(Context.INPUT_METHOD_SERVICE); inputMgr.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY); } }); alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { //Your specific code... } }); alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); return; } }); alert.show(); } 

尝试使用inputBox

 inputBox.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 

尝试使用视图

 v.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 

你有没有试图把焦点放在你的EditText – > inputBox.requestFocus()或类似的东西?

我知道,这个问题真的很老,但是因为我已经尝试了大约20种不同的所谓的“解决scheme”,所以我会贴出来,最终什么事情只对我有用。

这个答案是基于Pir Fahim Shah的回答,他指出我正确的方向(谢谢):

确保你把这个放在你的activity的onCreate中,当closures对话框时强制键盘被隐藏起来:

 this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

然后像这样创build一个对话框:

  AlertDialog.Builder builder = new Builder(this); builder.setTitle("title"); final EditText input = new EditText(this); input.setText("text"); input.setSelection(input.getText().length()); // set cursor to end builder.setView(input); input.setOnFocusChangeListener(new OnFocusChangeListener() { public void onFocusChange(View v, boolean hasFocus) { if(hasFocus) { InputMethodManager inputMgr = (InputMethodManager)v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE); inputMgr.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY); } } }); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // do something here dialog.dismiss(); } }); builder.setNegativeButton("Cancel", null); builder.show(); 

嗨Prepbgg实际上是一个替代方法,你已经做了什么。 我实际上不得不在我的ArrayAdapter中使用我的。 我所做的是将活动的上下文传递给arrayadapter,然后调用它来访问getWindow(),如下所示:

 NoteArrayAdapter(Activity _activity, int _layout, ArrayList<Note> _notes, Context _context) { callingNoteListObj = (NoteList) _context; } // withiin getView callingNoteListObj.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); // within parent activity's onCreate() thisObject = this; //within my parent activity's fillData() (NoteList) adapter = new NoteArrayAdapter(activity, R.layout.channel_note_list_item, noteList, thisObject); 

在下面的代码片段中,我演示了如何在DialogFragment托pipe任意的LinearLayout 。 一个使用AlertDialog (软键盘不起作用)和另一种方式不使用AlertDialog (软键盘工作!):

 public static LinearLayout createLinearLayout(Context context) { LinearLayout linearLayout = new LinearLayout(context); linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); String html; html = "<form action=search method=get >\n"; html += "Google Search: <input name=q value=\"Johnny Depp\" /><br/>\n"; html += "<input type=submit name=output value=search /><br/>\n"; html += "</form>\n"; WebView webView = new WebView(context); webView.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); webView.getSettings().setJavaScriptEnabled(true); webView.setWebChromeClient(new WebChromeClient()); webView.setWebViewClient(new WebViewClient()); webView.loadDataWithBaseURL("http://www.google.com", html, "text/html", "UTF-8", null); linearLayout.addView(webView); return linearLayout; } public void showWithAlertDialog() { DialogFragment dialogFragment = new DialogFragment() { public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder .setTitle("With AlertDialog") .setView(createLinearLayout(getActivity())); return builder.create(); } }; FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); dialogFragment.show(fragmentTransaction, "dialog"); } public void showWithoutAlertDialog() { DialogFragment dialogFragment = new DialogFragment() { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { getDialog().setTitle("Without AlertDialog"); getDialog().setCanceledOnTouchOutside(false); return createLinearLayout(getActivity()); } }; FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); dialogFragment.show(fragmentTransaction, "dialog"); } 

我想你几乎已经在你原来的问题上工作了。 尝试创build一个final AlertDialog来调用getWindow() ,例如

 // Create the dialog used to modify the mailbox alias final AlertDialog dialog = alert.create(); inputBox.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { dialog.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); } } }); 

我已经testing了这个代码,现在键盘上的大部分设备都会自动出现,其中包括:

  • 三星Galaxy Tab OS 2.2
  • 三星Galaxy S OS 2.1
  • HTC Sensation OS 2.3.4

对此解决scheme的其他一些意见:

1)检查你的XML中是否有任何东西要求重点关注,因为这可能会阻止这个代码的工作(根据泰德在你链接到的问题)。

2)这个代码似乎没有工作在我的HTC G2运行OS 2.3.4。 我猜这是因为它有一个物理键盘,也许WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE选项不起作用呢?

我也尝试了SOFT_INPUT_STATE_VISIBLE(没有ALWAYS),但是停止键盘自动出现。

3)您可能还想添加代码,以便用户可以按下键盘上的完成button来提交更改,例如

 inputAlias.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_ENTER && inputAlias.isFocused() && inputAlias.getText().length() != 0) { // Save the new information here // Dismiss the dialog dialog.dismiss(); return true; } return false; } }); 

我发现这工作在从不同的地方调用警报对话框

  case R.id.birthyear: case R.id.ymax: input.setInputType(InputType.TYPE_CLASS_NUMBER); break; 

请注意,我也尝试了很多其他的东西。 看起来很微妙。