如何在警报对话框中添加两个编辑文本字段

我正在尝试使用一个警告对话框在Android中提示input用户名和密码。 我在这里find了这个代码:

if (token.equals("Not Found")) { LayoutInflater factory = LayoutInflater.from(this); final View textEntryView = factory.inflate(R.layout.userpasslayout, null); AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setTitle("Please Login to Fogbugz"); alert.setMessage("Enter your email and password"); // Set an EditText view to get user input alert.setView(textEntryView); AlertDialog loginPrompt = alert.create(); final EditText input1 = (EditText) loginPrompt.findViewById(R.id.username); final EditText input2 = (EditText) loginPrompt.findViewById(R.id.password); alert.setPositiveButton("Login", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { input1.getText().toString(); **THIS CRASHES THE APPLICATION** } }); alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // Canceled. } }); alert.show(); } 

编辑:我能够设置正确的布局,但当我尝试访问文本字段时收到错误。 这里有什么问题?

Android SDK中的API演示就是一个例子。

它在DIALOG_TEXT_ENTRY下。 他们有一个布局,用一个LayoutInflater夸大它,并用它作为视图。

编辑:我原来的回答链接到的是陈旧的。 这是一面镜子 。

点击确定后,在警告框中检查这个代码有编辑textview使用吐司显示在屏幕上。

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final AlertDialog.Builder alert = new AlertDialog.Builder(this); final EditText input = new EditText(this); alert.setView(input); alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { String value = input.getText().toString().trim(); Toast.makeText(getApplicationContext(), value, Toast.LENGTH_SHORT).show(); } }); alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.cancel(); } }); alert.show(); } 

在代码中使用这些行,因为textEntryView是用户名edittext和密码edittext的父代。

  final EditText input1 = (EditText) textEntryView .findViewById(R.id.username); final EditText input2 = (EditText) textEntryView .findViewById(R.id.password); 
  LayoutInflater factory = LayoutInflater.from(this); final View textEntryView = factory.inflate(R.layout.text_entry, null); //text_entry is an Layout XML file containing two text field to display in alert dialog final EditText input1 = (EditText) textEntryView.findViewById(R.id.EditText1); final EditText input2 = (EditText) textEntryView.findViewById(R.id.EditText2); input1.setText("DefaultValue", TextView.BufferType.EDITABLE); input2.setText("DefaultValue", TextView.BufferType.EDITABLE); final AlertDialog.Builder alert = new AlertDialog.Builder(this); alert.setIcon(R.drawable.icon) .setTitle("Enter the Text:") .setView(textEntryView) .setPositiveButton("Save", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { Log.i("AlertDialog","TextEntry 1 Entered "+input1.getText().toString()); Log.i("AlertDialog","TextEntry 2 Entered "+input2.getText().toString()); /* User clicked OK so do some stuff */ } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }); alert.show(); 
  /* Didn't test it but this should work "out of the box" */ AlertDialog.Builder builder = new AlertDialog.Builder(this); //you should edit this to fit your needs builder.setTitle("Double Edit Text"); final EditText one = new EditText(this); from.setHint("one");//optional final EditText two = new EditText(this); to.setHint("two");//optional //in my example i use TYPE_CLASS_NUMBER for input only numbers from.setInputType(InputType.TYPE_CLASS_NUMBER); to.setInputType(InputType.TYPE_CLASS_NUMBER); LinearLayout lay = new LinearLayout(this); lay.setOrientation(LinearLayout.VERTICAL); lay.addView(one); lay.addView(two); builder.setView(lay); // Set up the buttons builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { //get the two inputs int i = Integer.parseInt(one.getText().toString()); int j = Integer.parseInt(two.getText().toString()); } }); builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.cancel(); } }); builder.show(); 

检查下面的代码。 它以编程方式显示2个编辑文本字段,没有任何布局xml。 如果在片段中使用“this”,则将其更改为“getActivity()”。

棘手的是,我们必须在创build警报对话框之后设置第二个文本字段的inputtypes,否则第二个文本字段将显示文本而不是点。

  public void showInput() { OnFocusChangeListener onFocusChangeListener = new OnFocusChangeListener() { @Override public void onFocusChange(final View v, boolean hasFocus) { if (hasFocus) { // Must use message queue to show keyboard v.post(new Runnable() { @Override public void run() { InputMethodManager inputMethodManager= (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.showSoftInput(v, 0); } }); } } }; final EditText editTextName = new EditText(this); editTextName.setHint("Name"); editTextName.setFocusable(true); editTextName.setClickable(true); editTextName.setFocusableInTouchMode(true); editTextName.setSelectAllOnFocus(true); editTextName.setSingleLine(true); editTextName.setImeOptions(EditorInfo.IME_ACTION_NEXT); editTextName.setOnFocusChangeListener(onFocusChangeListener); final EditText editTextPassword = new EditText(this); editTextPassword.setHint("Password"); editTextPassword.setFocusable(true); editTextPassword.setClickable(true); editTextPassword.setFocusableInTouchMode(true); editTextPassword.setSelectAllOnFocus(true); editTextPassword.setSingleLine(true); editTextPassword.setImeOptions(EditorInfo.IME_ACTION_DONE); editTextPassword.setOnFocusChangeListener(onFocusChangeListener); LinearLayout linearLayout = new LinearLayout(this); linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.addView(editTextName); linearLayout.addView(editTextPassword); DialogInterface.OnClickListener alertDialogClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which){ case DialogInterface.BUTTON_POSITIVE: // Done button clicked break; case DialogInterface.BUTTON_NEGATIVE: // Cancel button clicked break; } } }; final AlertDialog alertDialog = (new AlertDialog.Builder(this)).setMessage("Please enter name and password") .setView(linearLayout) .setPositiveButton("Done", alertDialogClickListener) .setNegativeButton("Cancel", alertDialogClickListener) .create(); editTextName.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { editTextPassword.requestFocus(); // Press Return to focus next one return false; } }); editTextPassword.setOnEditorActionListener(new OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { // Press Return to invoke positive button on alertDialog. alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick(); return false; } }); // Must set password mode after creating alert dialog. editTextPassword.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD); editTextPassword.setTransformationMethod(PasswordTransformationMethod.getInstance()); alertDialog.show(); } 

看看AlertDialog 文档 。 正如它所说的,为了将自定义视图添加到您的警报对话框中,您需要findframeLayout并将您的视图添加到如下所示:

 FrameLayout fl = (FrameLayout) findViewById(android.R.id.custom); fl.addView(myView, new LayoutParams(MATCH_PARENT, WRAP_CONTENT)); 

最有可能的是你想要为你的视图创build一个布局的XML文件,并夸大它:

 LayoutInflater inflater = getLayoutInflater(); View twoEdits = inflater.inflate(R.layout.my_layout, f1, false); 

我发现另外一个例子来定制一个名叫Mossila的人的AlertDialog。 我认为他们比谷歌的例子好。 要快速查看Google的API演示,您必须将其演示jar导入到您可能不需要的项目中。

但是Mossila的示例代码是完全独立的。 它可以直接剪切并粘贴到您的项目中。 它只是工作! 那么你只需要调整它到你的需求。 看到这里