Comment sélectionner une entrée dans AlertDialog avec une case à cocher simple choix Android?

La méthode dans le code affiché ci-dessous, je crée une boîte de dialogue d'alerte avec une liste à choix unique avec deux boutons: un bouton OK et un bouton d'annulation. Mon objectif est de faire lorsque vous appuyez sur le bouton OK, vous obtenez le nom du bouton radio sélectionné.

private final Dialog createListFile(final String[] fileList) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Compare with:"); builder.setSingleChoiceItems(fileList, -1, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { Log.d(TAG,"The wrong button was tapped: "+fileList[whichButton]); } }); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }); builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }); return builder.create(); } 

J'ai essayé de sauvegarder la chaîne dans une variable, mais dans une classe interne, je ne peux utiliser que les variables finales. Comment puis-je le réparer?

3 Solutions collect form web for “Comment sélectionner une entrée dans AlertDialog avec une case à cocher simple choix Android?”

L'utilisation d'une variable finale évidemment ne fonctionnera pas (car elle ne peut être attribuée qu'une seule fois, au moment de la déclaration). Les variables dites «globales» sont habituellement une odeur de code (surtout lorsqu'elles font partie d'une classe d'activité, qui est habituellement où AlertDialogs sont créés). La solution la plus propre est de lancer l'objet DialogInterface sur AlertDialog, puis appeler getListView (). GetCheckedItemPosition (). Comme ça:

 new AlertDialog.Builder(this) .setSingleChoiceItems(items, 0, null) .setPositiveButton(R.string.ok_button_label, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); int selectedPosition = ((AlertDialog)dialog).getListView().getCheckedItemPosition(); // Do something useful withe the position of the selected radio button } }) .show(); 

Cela a été bien répondu, mais je continue de trouver cette réponse de Google et je voulais partager une solution de classe non anonyme. Je préfère les cours réutilisables moi-même et peut être utile pour les autres.

Dans cet exemple, j'utilise une implémentation DialogFragment et récupère une valeur via une méthode de rappel .

La méthode de rappel pour obtenir des valeurs à partir d'une boîte de dialogue peut se faire en créant une interface publique

 public interface OnDialogSelectorListener { public void onSelectedOption(int selectedIndex); } 

De plus, le DialogFragment implémente DialogInterface.OnClickListener ce qui signifie que vous pouvez enregistrer la classe que vous avez implémentée comme OnClickListener pour le DialogFragment cours de création.

Par exemple

 public Dialog onCreateDialog(Bundle savedInstanceState) { final AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity()); builder.setTitle(R.string.select); builder.setSingleChoiceItems(mResourceArray, mSelectedIndex, this); builder.setPositiveButton(R.string.ok, this); builder.setNegativeButton(R.string.cancel, this); return builder.create(); } 

La ligne

builder.setSingleChoiceItems(mResourceArray, mSelectedIndex, this);

Crée une boîte de dialogue de choix avec les options d'un tableau de ressources stocké dans mResourceArray . Cela présélectionne également un index d'option à partir de ce qui est stocké dans mSelectedIndex et enfin il le définit comme OnClickListener . (Voir le code complet à la fin si ce paragraphe est un peu confus)

Maintenant, la méthode OnClick est l'endroit où vous prenez la valeur provenant de la boîte de dialogue

 @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case Dialog.BUTTON_NEGATIVE: // Cancel button selected, do nothing dialog.cancel(); break; case Dialog.BUTTON_POSITIVE: // OK button selected, send the data back dialog.dismiss(); // message selected value to registered callbacks with the // selected value. mDialogSelectorCallback.onSelectedOption(mSelectedIndex); break; default: // choice item selected // store the new selected value in the static variable mSelectedIndex = which; break; } } 

Ce qui se passe ici, c'est quand un élément est sélectionné, il est stocké dans une variable. Si l'utilisateur clique sur le bouton Annuler , aucune mise à jour n'est renvoyée et rien ne change. Si l'utilisateur clique sur le bouton OK, il renvoie la valeur à l' Activity qui l'a créé via le rappel créé.

À titre d'exemple, voici comment créer la boîte de dialogue à partir d'une FragmentActivity .

 final SelectorDialog sd = SelectorDialog.newInstance(R.array.selector_array, preSelectedValue); sd.show(getSupportFragmentManager(), TAG); 

Ici, le réseau de ressources _R.array.selector_array_ est un ensemble de chaînes à afficher dans la boîte de dialogue et preSelectedValue est l'index à sélectionner ouvert.

Enfin, votre FragmentActivity implémentera OnDialogSelectorListener et recevra le message de rappel.

 public class MyActivity extends FragmentActivity implements OnDialogSelectorListener { // .... public void onSelectedOption(int selectedIndex) { // do something with the newly selected index } } 

J'espère que cela est utile pour quelqu'un, car il m'a fallu beaucoup de tentatives pour le comprendre. Une implémentation complète de ce type de DialogFragment avec un rappel est ici.

 public class SelectorDialog extends DialogFragment implements OnClickListener { static final String TAG = "SelectorDialog"; static int mResourceArray; static int mSelectedIndex; static OnDialogSelectorListener mDialogSelectorCallback; public interface OnDialogSelectorListener { public void onSelectedOption(int dialogId); } public static DialogSelectorDialog newInstance(int res, int selected) { final DialogSelectorDialog dialog = new DialogSelectorDialog(); mResourceArray = res; mSelectedIndex = selected; return dialog; } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mDialogSelectorCallback = (OnDialogSelectorListener)activity; } catch (final ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnDialogSelectorListener"); } } public Dialog onCreateDialog(Bundle savedInstanceState) { final AlertDialog.Builder builder = new AlertDialog.Builder(this.getActivity()); builder.setTitle(R.string.select); builder.setSingleChoiceItems(mResourceArray, mSelectedIndex, this); builder.setPositiveButton(R.string.ok, this); builder.setNegativeButton(R.string.cancel, this); return builder.create(); } @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case Dialog.BUTTON_NEGATIVE: dialog.cancel(); break; case Dialog.BUTTON_POSITIVE: dialog.dismiss(); // message selected value to registered calbacks mDialogSelectorCallback.onSelectedOption(mSelectedIndex); break; default: // choice selected click mSelectedIndex = which; break; } } } 

Question d'un commentaire Comment appeler cela à partir d'un Fragment au lieu d'une Activity .

DialogFragment abord quelques modifications dans DialogFragment .

Supprimez l'événement onAttach car ce n'est pas le moyen le plus simple dans ce scénario.

Ajouter une nouvelle méthode pour ajouter une référence au rappel

 public void setDialogSelectorListener (OnDialogSelectorListener listener) { this.mListener = listener; } 

Implémentez l'auditeur dans votre Fragment

 public class MyFragment extends Fragment implements SelectorDialog.OnDialogSelectorListener { // .... public void onSelectedOption(int selectedIndex) { // do something with the newly selected index } } 

Créez maintenant une nouvelle instance et passez une référence au Fragment pour l'utiliser.

 final SelectorDialog sd = SelectorDialog.newInstance(R.array.selector_array, preSelectedValue); // this is a reference to MyFragment sd.setDialogSelectorListener(this); // mActivity is just a reference to the activity attached to MyFragment sd.show(this.mActivity.getSupportFragmentManager(), TAG); 
 final CharSequence[] choice = {"Choose from Gallery","Capture a photo"}; int from; //This must be declared as global ! AlertDialog.Builder alert = new AlertDialog.Builder(activity); alert.setTitle("Upload Photo"); alert.setSingleChoiceItems(choice, -1, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (choice[which] == "Choose from Gallery") { from = 1; } else if (choice[which] == "Capture a photo") { from = 2; } } }); alert.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (from == 0) { Toast.makeText(activity, "Select One Choice", Toast.LENGTH_SHORT).show(); } else if (from == 1) { // Your Code } else if (from == 2) { // Your Code } } }); alert.show(); 
coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.