Comment append deux champs de texte d’édition dans une boîte de dialog d’alerte

J’essaie d’utiliser une boîte de dialog d’alerte pour demander un nom d’utilisateur et un mot de passe dans Android. J’ai trouvé ce code ici:

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().toSsortingng(); **THIS CRASHES THE APPLICATION** } }); alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { // Canceled. } }); alert.show(); } 

EDIT: J’ai pu configurer la mise en page correcte, mais recevoir une erreur lorsque j’essaie d’accéder au champ de texte. Quel est le problème ici?

Les démos d’API dans le SDK Android en ont un exemple.

C’est sous DIALOG_TEXT_ENTRY . Ils ont une mise en page, la gonflent avec un LayoutInflater et l’utilisent comme vue.

EDIT: Ce que j’avais lié dans ma réponse originale est vicié. Voici un miroir

Cochez ce code dans la boîte d’alerte pour modifier la vue de texte lorsque vous cliquez sur OK pour l’afficher à l’écran à l’aide de toast.

 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) { Ssortingng value = input.getText().toSsortingng().sortingm(); 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(); } 

Utilisez ces lignes dans le code, car le textEntryView est le parent du nom d’utilisateur edittext et du mot de passe 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().toSsortingng()); Log.i("AlertDialog","TextEntry 2 Entered "+input2.getText().toSsortingng()); /* 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().toSsortingng()); int j = Integer.parseInt(two.getText().toSsortingng()); } }); builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.cancel(); } }); builder.show(); 

Vérifiez le code suivant. Il montre 2 champs de texte d’édition par programmation sans aucune disposition XML. Remplacez ‘this’ par ‘getActivity ()’ si vous l’utilisez dans un fragment.

La chose délicate est que nous devons définir le type de saisie du deuxième champ de texte après avoir créé le dialog d’alerte, sinon, le deuxième champ de texte affiche des textes au lieu de points.

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

Jetez un coup d’œil aux documents AlertDialog. Comme il est dit, pour append une vue personnalisée à votre boîte de dialog d’alerte, vous devez rechercher le frameLayout et append votre vue à celle-ci comme suit:

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

Vous allez probablement vouloir créer un fichier XML de présentation pour votre vue et le gonfler:

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

J’ai trouvé une autre série d’exemples pour personnaliser un AlertDialog à partir d’un gars nommé Mossila. Je pense qu’ils sont meilleurs que les exemples de Google. Pour voir rapidement les démos de l’API Google, vous devez importer leur ou leurs fichiers de démonstration dans votre projet, ce que vous ne voulez probablement pas.

Mais l’exemple de code de Mossila est totalement autonome. Il peut être directement collé dans votre projet. Ça marche! Ensuite, il vous suffit de le modifier selon vos besoins. Voir ici