web-dev-qa-db-fra.com

Comment puis-je obtenir les résultats d'un AlertDialog?

J'utilise AlertDialog.Builder pour afficher une boîte de dialogue invitant l'utilisateur à saisir un mot de passe. Je souhaite ensuite enregistrer ce mot de passe dans une préférence. Cependant, je ne vois pas comment obtenir le résultat de la méthode de saisie de la boîte de dialogue d'alerte.

Voici essentiellement ce que j'aimerais pouvoir faire:

    String result;
    AlertDialog.Builder b = new AlertDialog.Builder(this);
    b.setTitle("Please enter a password");
    final EditText input = new EditText(this);
    b.setView(input);
    b.setPositiveButton("OK", new DialogInterface.OnClickListener()
    {
        @Override
        public void onClick(DialogInterface dialog, int whichButton)
        {
           //I get a compile error here, it wants result to be final.
           result = input.getText().toString();
        }
    });
    b.setNegativeButton("CANCEL", null);
    b.create().show();

Cependant, je suis ouvert à faire quelque chose comme showDialog(int);, puis à utiliser la méthode onCreateDialog(int) et à définir le résultat et à le recevoir de quelque manière que ce soit, mais je ne sais pas comment procéder pour la dernière partie.

19
finiteloop
public class MyActivity extends Activity {
    private String result;

    void showDialog() {
        AlertDialog.Builder b = new AlertDialog.Builder(this);
        b.setTitle("Please enter a password");
        final EditText input = new EditText(this);
        b.setView(input);
        b.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int whichButton) {
                result = input.getText().toString();
            }
        });
        b.setNegativeButton("CANCEL", null);
        b.show();
    }
}
24
Femi

Exemple simplifié:

public interface TextListener {
    void onPositiveResult(CharSequence text);
}

public static AlertDialog getTextDialog(Context ctx,
        final TextListener listener) {
    View view = LayoutInflater.from(ctx).inflate(R.layout.dialog, null);
    final TextView tv = (TextView) view.findViewById(R.id.tv);
    AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
    builder.setView(view);
    //
    builder.setPositiveButton(Android.R.string.ok, new OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            listener.onPositiveResult(tv.getText());
        }
    });
    builder.setNegativeButton(Android.R.string.cancel, null);
    return builder.create();
}

- EDIT - Ou essayez ce code: 

 public class Main extends Activity {
    private Button btn;
    private String result;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                showDialog(0);
            }
        });
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case 0:
            final EditText input = new EditText(this);

            return new AlertDialog.Builder(this)
            .setIcon(R.drawable.icon)
            .setTitle("Please enter a password")
            .setView(input)
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int whichButton) {
                    Toast.makeText(getBaseContext(), input.getText().toString(), Toast.LENGTH_SHORT).show();
                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int whichButton) {
                    Toast.makeText(getBaseContext(), "Cancel clicked!", Toast.LENGTH_SHORT).show();
                }
            }).create();
        }

        return null;
    }
}
3
evilone

Vous pouvez suivre le tutoriel Dialog dans developer.Android.com.

Commencez par créer une classe de dialogue:

Ajouter une liste

Ajoutez ensuite un auditeur à cette classe pour transmettre le résultat à l'activité.

Événements passés Retour à l'hôte du dialogue

1
fred.yu

Solution faible mais rapide:

Déclarez une méthode de niveau d'activité:

TextView lblDiaDestination;

public void dialogReturn(String msg){
   lblDiaDestination.setText(msg);
}

et appelez-le à partir du bouton positif listner:

alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        dialogReturn(   input.getText().toString().trim()   );
    });

Vous pouvez modifier la valeur de lblDiaDestination juste avant alert.show ():

lblDiaDestination = myTextView;
alert.show():
1
Elleboro

Résultat de la variable, faites-en une variable membre, au lieu d'une variable locale. En faisant de "result" la variable membre, elle est accessible dans toute l'activité (classe parente qui étend l'activité).

1
sat

C'est assez long. J'espère que ma contribution pourra être utile aux nouveaux venus. Je pense que la clé pour répondre à la question est de déclarer la variable result en tant que membre de l'activité (appelons-la YourActivity ) . Ensuite, depuis la méthode "onClick", utilisez YourActivity.this.result pour accéder à cette variable.

J'édite les codes @finiteloop comme ci-dessous:

public class YourActivity extends Activity {
    private String result;
    // other activity stuff

    void showDialog(){
        AlertDialog.Builder b = new AlertDialog.Builder(this);
        b.setTitle("Please enter a password");
        final EditText input = new EditText(this);
        b.setView(input);
        b.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int whichButton) {        
               YourActivity.this.result = input.getText().toString();
            }
        });
        b.setNegativeButton("CANCEL", null);
        b.create().show();
    }
}
0
hoang21