web-dev-qa-db-fra.com

Comment contrôler sur MultiChoice AlertDialog

J'utilise Dialog dans mon application pour permettre à l'utilisateur de faire plusieurs choix. Voici mon code:

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Build an AlertDialog
            AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

            // String array for alert dialog multi choice items
            String[] colors = new String[]{
                    "Red",
                    "Green",
                    "Blue",
                    "Purple",
                    "Olive"
            };

            // Boolean array for initial selected items
            final boolean[] checkedColors = new boolean[]{
                    false, // Red
                    false, // Green
                    false, // Blue
                    false, // Purple
                    false // Olive

            };

            // Convert the color array to list
            final List<String> colorsList = Arrays.asList(colors);

            // Set multiple choice items for alert dialog

            builder.setMultiChoiceItems(colors, checkedColors, new DialogInterface.OnMultiChoiceClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which, boolean isChecked) {

                    // Update the current focused item's checked status
                    checkedColors[which] = isChecked;

                    // Get the current focused item
                    String currentItem = colorsList.get(which);

                    // Notify the current action
                    Toast.makeText(getApplicationContext(),
                            currentItem + " " + isChecked, Toast.LENGTH_SHORT).show();
                }
            });

            // Specify the dialog is not cancelable
            builder.setCancelable(false);

            // Set a title for alert dialog
            builder.setTitle("Your preferred colors?");

            // Set the positive/yes button click listener
            builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // Do something when click positive button
                    tv.setText("Your preferred colors..... \n");
                    for (int i = 0; i<checkedColors.length; i++){
                        boolean checked = checkedColors[i];
                        if (checked) {
                            tv.setText(tv.getText() + colorsList.get(i) + ", ");
                        }
                    }
                }
            });

            // Set the negative/no button click listener
            builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // Do something when click the negative button
                }
            });

            // Set the neutral/cancel button click listener
            builder.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // Do something when click the neutral button
                }
            });

            AlertDialog dialog = builder.create();
            // Display the alert dialog on interface
            dialog.show();
        }
    });

Et j'ai deux questions:

  1. Comme j'ai choisi le rouge et le violet 

    (puis dans TextView obtenant une sortie comme ceci: Red, Purple,)

    Tout d'abord je voudrais supprimer la virgule (qui a la dernière valeur)

  2. J'ai déjà sélectionné Rouge et Violet, quand j'ouvre à nouveau la boîte de dialogue ne devenant pas rouge et violet comme sélectionné par défaut (Comment puis-je enregistrer l'état) enter code here, et en conséquence, lorsque je sélectionne à nouveau ces deux éléments (Rouge et Violet), obtenir chaque élément deux fois dans un TextView

8
Oreo

Essayez de mettre à jour votre textview après la boucle

Et si votre itération de boucle atteint la longueur de la variable checkedcolors, n’ajoutez pas de virgule.

public void onClick(DialogInterface dialog, int which) {
        // Do something when click positive button
        tv.setText("Your preferred colors..... \n");
        for (int i = 0; i < checkedColors.length; i++) {
            boolean checked = checkedColors[i];
            String colors = "";
            if (checked) {
                colors = colors + colorsList.get(i) ;
                if (i != checkedColors.length - 1) {
                    colors = colors + ", ";
                }
            }
        }
        tv.setText(tv.getText() + colors);
    }

Votre texte ne sera mis à jour qu'une seule fois, vous ne recevrez donc pas chaque élément deux fois dans TextView.

Pour sauvegarder l’état, vous devez utiliser SharedPreference.

Pour enregistrer de préférence, utilisez cette

       SharedPreferences preferences = mContext.getSharedPreferences("PREFERENCE_NAME", Context.MODE_PRIVATE);

        SharedPreferences.Editor editor = preferences.edit();
        editor.putBoolean("yourColor",isChecked);
        editor.commit();

Et pour récupérer

        boolean isChecked = preferences.getBoolean("yourColor");
2
Emil

Essayez ceci et améliorez la structure de votre code afin qu'il puisse être géré efficacement.

import Android.app.AlertDialog;
import Android.content.DialogInterface;
import Android.os.Bundle;
import Android.support.v7.app.AppCompatActivity;
import Android.view.View;
import Android.widget.Button;
import Android.widget.TextView;
import Android.widget.Toast;

import Java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    private Button btn;
    private TextView txtSelected;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.btn_dialog);
        txtSelected = (TextView) findViewById(R.id.txt_selected);

        final ArrayList<ColorVO> colorList = new ArrayList<ColorVO>();
        // String array for alert dialog multi choice items
        final String[] colors = new String[]{
                "Red",
                "Green",
                "Blue",
                "Purple",
                "Olive"
        };
        // Boolean array for initial selected items
        final boolean[] checkedColors = new boolean[]{
                false, // Red
                false, // Green
                false, // Blue
                false, // Purple
                false // Olive

        };

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

                // make a list to hold state of every color
                for (int i = 0; i < colors.length; i++) {
                    ColorVO colorVO = new ColorVO();
                    colorVO.setName(colors[i]);
                    colorVO.setSelected(checkedColors[i]);
                    colorList.add(colorVO);
                }

                // Do something here to pass only arraylist on this both arrays ('colors' & 'checkedColors')
                builder.setMultiChoiceItems(colors, checkedColors, new DialogInterface.OnMultiChoiceClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                        // set state to vo in list
                        colorList.get(which).setSelected(isChecked);
                        Toast.makeText(getApplicationContext(),
                                colorList.get(which).getName() + " " + isChecked, Toast.LENGTH_SHORT).show();
                    }
                });

                builder.setCancelable(false);

                builder.setTitle("Your preferred colors?");

                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        txtSelected.setText("Your preferred colors..... \n");

                        // save state of selected vos
                        ArrayList<ColorVO> selectedList = new ArrayList<>();
                        for (int i = 0; i < colorList.size(); i++) {
                            ColorVO colorVO = colorList.get(i);
                            colors[i] = colorVO.getName();
                            checkedColors[i] = colorVO.isSelected();
                            if (colorVO.isSelected()) {
                                selectedList.add(colorVO);
                            }
                        }

                        for (int i = 0; i < selectedList.size(); i++) {
                            // if element is last then not attach comma or attach it
                            if (i != selectedList.size() - 1)
                                txtSelected.setText(txtSelected.getText() + selectedList.get(i).getName() + " ,");
                            else
                                txtSelected.setText(txtSelected.getText() + selectedList.get(i).getName());
                        }
                        colorList.clear();
                    }
                });

                builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // make sure to clear list that duplication dont formed here
                        colorList.clear();
                    }
                });

                builder.setNeutralButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // make sure to clear list that duplication dont formed here
                        colorList.clear();
                    }
                });

                AlertDialog dialog = builder.create();
                dialog.show();
            }
        });
    }

    private class ColorVO {
        private String name;
        private boolean selected;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public boolean isSelected() {
            return selected;
        }

        public void setSelected(boolean selected) {
            this.selected = selected;
        }
    }

Résolu toutes vos questions:

1. Comme si j'avais sélectionné le rouge et le violet

=> Vérifier l’index de l’élément. Si c’est le dernier, ne pas joindre de virgule.

2. J'ai déjà sélectionné Rouge et Violet, quand j'ouvre à nouveau la boîte de dialogue ne devenant pas rouge et violet comme sélectionné par défaut (Comment puis-je enregistrer l'état)

=> save state en utilisant vo dans votre tableau par défaut. Il sera sauvegardé jusqu'à ce que votre activité ne soit pas détruite.

3. Quand je sélectionne à nouveau ces deux éléments (rouge et violet), chaque élément est affiché deux fois dans un TextView.

=> Effacer la liste afin que les valeurs ne soient pas dupliquées.

4
AndiGeeky