Comment créer une boîte edittext dans une boîte de dialogue

211

J'essaye de faire une boîte edittext dans une boîte de dialogue pour entrer un mot de passe. et quand je fais, je ne peux pas faire. Je suis un débutant dedans. S'il vous plait aidez moi avec ceci.

public class MainActivity extends Activity {

Button create, show, setting;
//String pass="admin";String password;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    create = (Button)findViewById(R.id.amcreate);
    setting = (Button)findViewById(R.id.amsetting);
    show = (Button)findViewById(R.id.amshow);
    //input = (EditText)findViewById(R.id.this);

    setting.setVisibility(View.INVISIBLE);

    create.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            Intent myIntent1 = new Intent(view.getContext(), Create.class);
            startActivityForResult(myIntent1, 0);
        }

    });

    show.setOnClickListener(new View.OnClickListener() {
        //@SuppressWarnings("deprecation")
        public void onClick(final View view) {

            // Creating alert Dialog with one Button
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);

            //AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();

            // Setting Dialog Title
            alertDialog.setTitle("PASSWORD");

            // Setting Dialog Message
            alertDialog.setMessage("Enter Password");
            **final EditText input = new EditText(this);**
            //alertDialog.setView(input);

            // Setting Icon to Dialog
            alertDialog.setIcon(R.drawable.key);

            // Setting Positive "Yes" Button
            alertDialog.setPositiveButton("YES",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,int which) {
                            // Write your code here to execute after dialog
                            Toast.makeText(getApplicationContext(),"Password Matched", Toast.LENGTH_SHORT).show();
                            Intent myIntent1 = new Intent(view.getContext(), Show.class);
                            startActivityForResult(myIntent1, 0);
                        }
                    });
            // Setting Negative "NO" Button
            alertDialog.setNegativeButton("NO",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            // Write your code here to execute after dialog
                            dialog.cancel();
                        }
                    });

            // closed

            // Showing Alert Message
            alertDialog.show();
        }

    }); 

Image

entrez la description de l'image ici

Je veux devenir

entrez la description de l'image ici

 AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
 alertDialog.setTitle("PASSWORD");
 alertDialog.setMessage("Enter Password");

 final EditText input = new EditText(MainActivity.this);
 LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
     LinearLayout.LayoutParams.MATCH_PARENT,
     LinearLayout.LayoutParams.MATCH_PARENT);
 input.setLayoutParams(lp);
 alertDialog.setView(input);
 alertDialog.setIcon(R.drawable.key);

 alertDialog.setPositiveButton("YES",
     new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int which) {
             password = input.getText().toString();
             if (password.compareTo("") == 0) {
                 if (pass.equals(password)) {
                     Toast.makeText(getApplicationContext(),
                         "Password Matched", Toast.LENGTH_SHORT).show();
                     Intent myIntent1 = new Intent(view.getContext(),
                         Show.class);
                     startActivityForResult(myIntent1, 0);
                 } else {
                     Toast.makeText(getApplicationContext(),
                         "Wrong Password!", Toast.LENGTH_SHORT).show();
                 }
             }
         }
     });

 alertDialog.setNegativeButton("NO",
     new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int which) {
             dialog.cancel();
         }
     });

 alertDialog.show();
 }

 });
Abb
la source
1
consultez ce developer.android.com/guide/topics/ui/notifiers/toasts.html . vérifier le positionnement des toasts. Mais je suppose qu'il vaut mieux régler l'erreur pour edittext
Raghunandan

Réponses:

171

Utiliser le contexte Activtiy

Remplacez ceci

  final EditText input = new EditText(this);

Par

  final EditText input = new EditText(MainActivity.this);  
  LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                        LinearLayout.LayoutParams.MATCH_PARENT,
                        LinearLayout.LayoutParams.MATCH_PARENT);
  input.setLayoutParams(lp);
  alertDialog.setView(input); // uncomment this line
Raghunandan
la source
1
@Abhishek où se trouve votre initialisation. Comme Dialog dialog = new Dialog(MainActivity.this). Je pense que vous avez copié votre code ailleurs où je suppose
Raghunandan
1
@Abhishek désolé ma confusion, il pensait que vous aviez une boîte de dialogue personnalisée. public void onClick(DialogInterface dialogson interface de dialogue. en utilisant ce n'est pas un problème, vous cliquez sur le bouton négatif pour fermer le dialogue d'alerte.
Raghunandan
1
@Abhishek affiche un message toast ou définit une erreur pour edittext. stackoverflow.com/questions/7747268/…
Raghunandan
1
Toast toast = Toast.makeText (MainActivity.this, "Please Enter Password!", Toast.LENGTH_LONG); toast.setGravity (Gravity.CENTER, 0, 0); toast.show (); cela a fonctionné pour moi de porter le toast au centre.
Abb
5
Salut Raghu, Si je veux mettre la marge gauche et la marge droite dans cette boîte edittext, que dois-je écrire? J'ai essayé de nombreuses réponses, pour définir la marge par programme, mais rien n'a fonctionné :(
Lucifer
287

Je sais qu'il est trop tard pour répondre à cette question, mais pour ceux qui recherchent quelque chose de similaire à ceci, voici un simple code d'une boîte d'alerte avec un edittext

AlertDialog.Builder alert = new AlertDialog.Builder(this); 

ou

new AlertDialog.Builder(mContext, R.style.MyCustomDialogTheme);

si vous souhaitez changer le thème de la boîte de dialogue.

final EditText edittext = new EditText(ActivityContext);
alert.setMessage("Enter Your Message");
alert.setTitle("Enter Your Title");

alert.setView(edittext);

alert.setPositiveButton("Yes Option", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        //What ever you want to do with the value
        Editable YouEditTextValue = edittext.getText();
        //OR
        String YouEditTextValue = edittext.getText().toString();
    }
});

alert.setNegativeButton("No Option", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        // what ever you want to do with No option.
    }
});

alert.show();
Syeda Zunaira
la source
Où dois-je placer ce code? Lorsque j'ai essayé cela dans la méthode et que le dernier champ EditText placé en haut de la classe, il se bloque.
cerbin
quel est l'accident?
Syeda Zunaira
10
Comment donner de la marge à cet EditText?
Ghanshyam Nayma
1
Bonne suggestion du sujet demandé, mais un commentaire de style est nécessaire. Android n'est pas Windows, et il n'y a pas besoin d'un bouton d'annulation comme c'est un must dans Win32, il y a le bouton "Retour" du système d'exploitation qui sert d'annulation / non. Donc, ma suggestion est de sauter le bouton négatif dans une boîte de dialogue de demande de mot de passe, et le bouton positif ne devrait pas être "Oui" mais devrait être "OK" (et le localiser en utilisant android.R.string.ok). Voir plus dans ma réponse sur le sujet stackoverflow.com/questions/11459827/… .
Jan Bergström
2
Le champ d'édition doit également être une ligne (edittext.setSingleLine ();) dans une demande de mot de passe (car c'est le cas) et cela permet d'appuyer sur la touche Entrée sur un clavier physique (BT) attaché (ou un Chromebook) faisant passer le focus au article suivant, le bouton positif. ce qui signifie qu'après avoir saisi le texte, en appuyant deux fois sur la touche, le dialogue se termine positivement.
Jan Bergström
36

Le plus simple serait.

  • Créez un fichier de mise en page XML pour la boîte de dialogue. Ajoutez la vue que vous voulez comme EditText, ListView, Spinner etc.

    Gonflez cette vue et définissez-la sur AlertDialog

Commençons par le fichier de mise en page en premier.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical">


    <EditText
        android:id="@+id/etComments"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="top"
        android:hint="Enter comments(Optional)"
        android:inputType="textMultiLine"
        android:lines="8"
        android:maxLines="3"
        android:minLines="6"
        android:scrollbars="vertical" />

</LinearLayout>

final View view = layoutInflater.inflate(R.layout.xml_file_created_above, null);
AlertDialog alertDialog = new AlertDialog.Builder(ct).create();
alertDialog.setTitle("Your Title Here");
alertDialog.setIcon("Icon id here");
alertDialog.setCancelable(false);
Constant.alertDialog.setMessage("Your Message Here");


final EditText etComments = (EditText) view.findViewById(R.id.etComments);

alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {

    }
});


alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "Cancel", new OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        alertDialog.dismiss()
    }
});


alertDialog.setView(view);
alertDialog.show();
Balwinder SIngh
la source
3
Quel héros tu es.
AdamMcquiff
Je tombe en panne. J'ai trouvé la raison pour laquelle je suis tombé en panne parce que j'ai raté la «vue» sur le findViewById. Maintenant, j'ai juste besoin de savoir comment gérer une case à cocher afin que je puisse afficher ou masquer le mot de passe PENDANT que la boîte de dialogue est toujours en vie. J'ai essayé l'approche multi-éléments mais il a ajouté sa propre case à cocher en plus de celle de ma mise en page!
Brian Reinhold
24

Version simplifiée

final EditText taskEditText = new EditText(this);
AlertDialog dialog = new AlertDialog.Builder(this)
        .setTitle("Add a new task")
        .setMessage("What do you want to do next?")
        .setView(taskEditText)
        .setPositiveButton("Add", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String task = String.valueOf(taskEditText.getText());
                SQLiteDatabase db = mHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put(TaskContract.TaskEntry.COL_TASK_TITLE, task);
                db.insertWithOnConflict(TaskContract.TaskEntry.TABLE,
                        null,
                        values,
                        SQLiteDatabase.CONFLICT_REPLACE);
                db.close();
                updateUI();
            }
        })
        .setNegativeButton("Cancel", null)
        .create();
dialog.show();
return true;
Swarathesh Addanki
la source
12

Essayez le code ci-dessous:

alert.setTitle(R.string.WtsOnYourMind);

 final EditText input = new EditText(context);
 input.setHeight(100);
 input.setWidth(340);
 input.setGravity(Gravity.LEFT);

 input.setImeOptions(EditorInfo.IME_ACTION_DONE);
 alert.setView(input);
Pratik Dasa
la source
5

La définition de la marge dans les paramètres de mise en page ne fonctionnera pas dans Alertdialog. vous devez définir le remplissage dans la disposition parent, puis ajouter edittext dans cette disposition.

Ceci est mon code kotlin de travail ...

val alert =  AlertDialog.Builder(context!!)

val edittext = EditText(context!!)
edittext.hint = "Enter Name"
edittext.maxLines = 1

val layout = FrameLayout(context!!)

//set padding in parent layout
layout.setPaddingRelative(45,15,45,0)

alert.setTitle(title)

layout.addView(edittext)

alert.setView(layout)

alert.setPositiveButton(getString(R.string.label_save), DialogInterface.OnClickListener {

    dialog, which ->
    run {

        val qName = edittext.text.toString()

        Utility.hideKeyboard(context!!, dialogView!!)

    }

})
alert.setNegativeButton(getString(R.string.label_cancel), DialogInterface.OnClickListener {

            dialog, which ->
            run {
                dismiss()
            }

})

alert.show()
Wasim K. Memon
la source
4

Vous pouvez également créer une boîte de dialogue d'alerte personnalisée en créant un fichier xml.

dialoglayout.xml

   <EditText
    android:id="@+id/dialog_txt_name"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:hint="Name"
    android:singleLine="true" >

    <requestFocus />
  </EditText>
   <Button
        android:id="@+id/btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="60dp"
        android:background="@drawable/red"
        android:padding="5dp"
        android:textColor="#ffffff"
        android:text="Submit" />

    <Button
        android:id="@+id/btn_cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/btn_login"
        android:background="@drawable/grey"
        android:padding="5dp"
        android:text="Cancel" />

Le code Java:

@Override//to popup alert dialog
public void onClick(View arg0) {
    // TODO Auto-generated method stub
    showDialog(DIALOG_LOGIN);
});


@Override
protected Dialog onCreateDialog(int id) {
    AlertDialog dialogDetails = null;

    switch (id) {
        case DIALOG_LOGIN:
            LayoutInflater inflater = LayoutInflater.from(this);
            View dialogview = inflater.inflate(R.layout.dialoglayout, null);
            AlertDialog.Builder dialogbuilder = new AlertDialog.Builder(this);
            dialogbuilder.setTitle("Title");
            dialogbuilder.setView(dialogview);
            dialogDetails = dialogbuilder.create();
            break;
    }
    return dialogDetails;
}

@Override
protected void onPrepareDialog(int id, Dialog dialog) {
    switch (id) {
        case DIALOG_LOGIN:
             final AlertDialog alertDialog = (AlertDialog) dialog;
             Button loginbutton = (Button) alertDialog
                .findViewById(R.id.btn_login);
             Button cancelbutton = (Button) alertDialog
                .findViewById(R.id.btn_cancel);
             userName = (EditText) alertDialog
                .findViewById(R.id.dialog_txt_name);
             loginbutton.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      String name = userName.getText().toString();
                      Toast.makeText(Activity.this, name,Toast.LENGTH_SHORT).show();
             });
             cancelbutton.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                           alertDialog.dismiss();
                      }
             });
             break;
   }
}
Ombre
la source
c'est ce dont j'avais besoin mais comment puis-je l'utiliser en fragmentant son erreur d'affichage
Raju
0

La réponse de Wasim m'a conduit dans la bonne direction mais j'ai dû faire quelques changements pour le faire fonctionner pour mon projet actuel. J'utilise cette fonction dans un fragment et l'appelle sur clic de bouton.

fun showPostDialog(title: String) {
        val alert =  AlertDialog.Builder(activity)

        val edittext = EditText(activity)
        edittext.hint = "Enter Name"
        edittext.maxLines = 1

        var layout = activity?.let { FrameLayout(it) }

        //set padding in parent layout
//        layout.isPaddingRelative(45,15,45,0)
        layout?.setPadding(45,15,45,0)

        alert.setTitle(title)

        layout?.addView(edittext)

        alert.setView(layout)

        alert.setPositiveButton(getString(R.string.label_save), DialogInterface.OnClickListener {

                dialog, which ->
            run {

                val qName = edittext.text.toString()

                showToast("Posted to leaderboard successfully")

                view?.hideKeyboard()

            }

        })
        alert.setNegativeButton(getString(R.string.label_cancel), DialogInterface.OnClickListener {

                dialog, which ->
            run {
                dialog.dismiss()
            }

        })

        alert.show()
    }

    fun View.hideKeyboard() {
        val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(windowToken, 0)
    }

    fun showToast(message: String) {
        Toast.makeText(activity, message, Toast.LENGTH_LONG).show()
    }

J'espère que cela aidera quelqu'un d'autre dans un proche avenir. Bon codage!

thesamoanppprogrammer
la source