IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Cocher plusieurs checkbox


Sujet :

Android

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Points : 161
    Points
    161
    Par défaut Cocher plusieurs checkbox
    Bonjour,

    J'ai une classe (voir code ci-dessous) qui me permet de cocher plusieurs choix dans une ListPreferencres ( par défaut on ne peut en sélectionné que 1, sauf à partir de l'API 11).

    Cependant j'aimerais peaufiner le code. J'aimerais créer une méthode qui me permettrai d'effectuer la tâche suivante : si l'une des valeurs cochées est = "ALL" alors on sélectionne toutes les checkbox de ma liste. Pourriez vous m'aider ? Merci par avance.


    Voici ma classe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    package com.preferences;
     
     
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.preference.ListPreference;
    import android.util.AttributeSet;
    import android.widget.Toast;
     
    /**
     * A {link Preference} that displays a list of entries as
     * a dialog and allows multiple selections
     * <p>
     * This preference will store a string into the SharedPreferences. This string will be the values selected
     * from the {@link #setEntryValues(CharSequence[])} array.
     * </p>
     */
     
    public class ListPreferenceMultiSelect extends ListPreference {
        //Need to make sure the SEPARATOR is unique and weird enough that it doesn't match one of the entries.
        //Not using any fancy symbols because this is interpreted as a regex for splitting strings.
        private static final String SEPARATOR = "OV=I=XseparatorX=I=VO";
     
        private boolean[] mClickedDialogEntryIndices;
     
        public ListPreferenceMultiSelect(Context context, AttributeSet attrs) {
            super(context, attrs);
     
            mClickedDialogEntryIndices = new boolean[getEntries().length];
        }
     
        @Override
        public void setEntries(CharSequence[] entries) {
            super.setEntries(entries);
            mClickedDialogEntryIndices = new boolean[entries.length];
        }
     
        public ListPreferenceMultiSelect(Context context) {
            this(context, null);
        }
     
        @Override
        protected void onPrepareDialogBuilder(AlertDialog.Builder builder) {
            CharSequence[] entries = getEntries();
            CharSequence[] entryValues = getEntryValues();
     
            if (entries == null || entryValues == null || entries.length != entryValues.length ) {
                throw new IllegalStateException(
                        "ListPreference requires an entries array and an entryValues array which are both the same length");
            }
     
            restoreCheckedEntries();
            builder.setMultiChoiceItems(entries, mClickedDialogEntryIndices,
                    new DialogInterface.OnMultiChoiceClickListener() {
                        public void onClick(DialogInterface dialog, int which, boolean val) {
                            mClickedDialogEntryIndices[which] = val;
     
     
     
                        }
                    });
        }
     
        public static String[] parseStoredValue(CharSequence val) {
            if ( "".equals(val) )
                return null;
            else
                return ((String)val).split(SEPARATOR);
        }
     
        private void restoreCheckedEntries() {
            CharSequence[] entryValues = getEntryValues();
     
            String[] vals = parseStoredValue(getValue());
            if ( vals != null ) {
                for ( int j=0; j<vals.length; j++ ) {
                    String val = vals[j].trim();
                    for ( int i=0; i<entryValues.length; i++ ) {
                        CharSequence entry = entryValues[i];
                        if ( entry.equals(val) ) {
                            mClickedDialogEntryIndices[i] = true;
                            break;
                        }
                    }
                }
            }
        }
     
        @Override
        protected void onDialogClosed(boolean positiveResult) {
    //        super.onDialogClosed(positiveResult);
     
            CharSequence[] entryValues = getEntryValues();
            if (positiveResult && entryValues != null) {
                StringBuffer value = new StringBuffer();
                for ( int i=0; i<entryValues.length; i++ ) {
                    if ( mClickedDialogEntryIndices[i] ) {
                        value.append(entryValues[i]).append(SEPARATOR);
                    }
                }
     
                if (callChangeListener(value)) {
                    String val = value.toString();
                    if ( val.length() > 0 )
                        val = val.substring(0, val.length()-SEPARATOR.length());
                    setValue(val);
                }
            }
        }
    }

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    Points : 43
    Points
    43
    Par défaut
    Alors juste une petite idée toute simple :
    tu nomme toutes tes CheckBox de la même façon exemple:
    check1
    check2
    check3...

    tu fais un for each et tu coche toutes tes checkbox ^^

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par kangouroux Voir le message
    Alors juste une petite idée toute simple :
    tu nomme toutes tes CheckBox de la même façon exemple:
    check1
    check2
    check3...

    tu fais un for each et tu coche toutes tes checkbox ^^

    Mais comment savoir que l'une d'elle à bien comme valeur = "ALL" ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    Points : 43
    Points
    43
    Par défaut
    Tu la nomme checkAll par exemple et tu lui ajoute un évènement au clique voici un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CheckBox repeatChkBx = ( CheckBox ) findViewById( R.id.checkAll );
    repeatChkBx.setOnCheckedChangeListener(new OnCheckedChangeListener()
    {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
            if ( isChecked )
            {
                // Cocher toutes les checkbox ^^
            }else{
                //Décocher toutes les checkbox ^^
            }
     
        }
    });

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Points : 161
    Points
    161
    Par défaut
    Voilà ce que j'ai fais dans mon listener (voir code ci dessous/ , celà marche dans je coche "Toutes", les autres checkbox se cochent, mais lorsque je fais l'opération inverse : Quand "Toutes" est décochée, les checkbox ne se décochent pas. Voyez vous une erreur de conception ?

    Voici mon code du listener :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
     
            builder.setMultiChoiceItems(entries, mClickedDialogEntryIndices,
                    new DialogInterface.OnMultiChoiceClickListener() {
                        public void onClick(DialogInterface dialog, int which, boolean val) {
     
                            // Si valeur = "Toutes" est coché (true), on coche toutes les cases
                            if(entries[which].toString().equals("Toutes") && mClickedDialogEntryIndices[which])
                            {
     
                            	for(int i = 1; i < mClickedDialogEntryIndices.length;i++)
                            	{
     
                            		mClickedDialogEntryIndices[i] = true;
                            	}
                            }
     
                            // Si valeur = "Toutes" est décoché (false), on décoche toutes les cases
     
                            else if(entries[which].toString().equals("Toutes") && !mClickedDialogEntryIndices[which])
                            {
     
                            	for(int i = 1; i < mClickedDialogEntryIndices.length;i++)
                            	{
                            		mClickedDialogEntryIndices[i] = false;
                            		Log.e("ckeck"+i,""+mClickedDialogEntryIndices[i]);
                            	}
                            }
     
                            // Si c'est autre valeur
                            else  mClickedDialogEntryIndices[which] = val;
                        }
                    });

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    Points : 43
    Points
    43
    Par défaut
    Alors effectivement il y a une erreur.
    Quand tu click il coche toutes les case normale car tu vérifie que le nom est toutes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    entries[which].toString().equals("Toutes")
    Ce que tu dois faire c'est vérifier si oui ou non cette checkbox est coché et de checké ou non les autre checkbox.

    Le plus simple est d'appliquer à toutes tes checkbox la valeur de ta checkbox principal quand tu clique dessus.

    à chaud il me semble que c'est .ischecked()
    Mais je peut pas vérifier je suis en réunion actuellement

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par kangouroux Voir le message
    Alors effectivement il y a une erreur.
    Quand tu click il coche toutes les case normale car tu vérifie que le nom est toutes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    entries[which].toString().equals("Toutes")
    Ce que tu dois faire c'est vérifier si oui ou non cette checkbox est coché et de checké ou non les autre checkbox.

    Le plus simple est d'appliquer à toutes tes checkbox la valeur de ta checkbox principal quand tu clique dessus.

    à chaud il me semble que c'est .ischecked()
    Mais je peut pas vérifier je suis en réunion actuellement

    Chaque checkbox est associée à une valeur booléenne de mon tableau mClickedDialogEntryIndice[].

    Lorsque je clic sur une checkbox ma méthode onClick(DialogInterface dialog, int which, boolean val) est appelé avec param:int which le positionnement de ma checkbox et param:boolean val l'etat de ma checkbox (coché = true, décoché = false)

    Je fais donc ma vérification, et comme je l'ai dit plus haut , celà marche dans
    mon instruction if(valeur de la checbox = "Toutes" && checkbox coché(true)) mais celà ne marche pas pour le contraire.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    Points : 43
    Points
    43
    Par défaut
    Ok mes excuses dans ce cas je n'avais pas tout compris ^^

    Donc effectivement il y a une petit erreur que je n'avais pas vue en lecture rapide... et avec ton explication ça confirme bien ce que je pense.

    Mais avant de me lancer peut tu donner la ta fonction qui gère ton tableau ?

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par kangouroux Voir le message
    Ok mes excuses dans ce cas je n'avais pas tout compris ^^

    Donc effectivement il y a une petit erreur que je n'avais pas vue en lecture rapide... et avec ton explication ça confirme bien ce que je pense.

    Mais avant de me lancer peut tu donner la ta fonction qui gère ton tableau ?
    Toute ma classe est dans mon premier post

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    Points : 43
    Points
    43
    Par défaut
    Bon alors une seule idée pour le moment.
    Sachant que tu sauvegarde l'état de tes checkbox dans un tableau, je me trompe peut-être, mais il me semble que tu ne met jamais la valeur de la checkbox "toutes" à jour...

    Je pense que ton problème vient de là...

    Essaye et si c'est pas ça je vais reconstruire une app pour reproduire ton code et essayer de corriger ton problème ...

  11. #11
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Non mais en fait il suffit de suivre le même algo que pour une checkbox "normale":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private static final int ALL_INDEX = 0;
    public void onClick(DialogInterface dialog, int which, boolean val) {
       if (which == ALL_INDEX) {
           // was checked => unchecking all
           // was not checked => checking all
           boolean newValue = ! mClickedDialogEntryIndices[ALL_INDEX];
           for (int i = 0; i < mClickedDialogEntryIndices.length; ++i) 
                mClickedDialogEntryIndices[i] = newValue;
       } else {
           mClickedDialogEntryIndices[ALL_INDEX] = false;
           mClickedDialogEntryIndices[which] = ! mClickedDialogEntryIndices[which];
       }
    }
    Maintenant reste à savoir comment raffraichir l'interface.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  12. #12
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Non mais en fait il suffit de suivre le même algo que pour une checkbox "normale":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private static final int ALL_INDEX = 0;
    public void onClick(DialogInterface dialog, int which, boolean val) {
       if (which == ALL_INDEX) {
           // was checked => unchecking all
           // was not checked => checking all
           boolean newValue = ! mClickedDialogEntryIndices[ALL_INDEX];
           for (int i = 0; i < mClickedDialogEntryIndices.length; ++i) 
                mClickedDialogEntryIndices[i] = newValue;
       } else {
           mClickedDialogEntryIndices[ALL_INDEX] = false;
           mClickedDialogEntryIndices[which] = ! mClickedDialogEntryIndices[which];
       }
    }
    Maintenant reste à savoir comment raffraichir l'interface.
    Je peux créer une méthode CheckAll() et l'appeler dans ma condition ?

Discussions similaires

  1. [Prototype] Cocher une checkbox -> en coche plusieurs
    Par baggie dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 01/06/2012, 12h12
  2. Cocher plusieurs checkbox
    Par maxtheb dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 18/07/2009, 23h15
  3. Comment cocher/décocher plusieurs "checkbox"?
    Par Crazynoss dans le forum ASP
    Réponses: 2
    Dernier message: 15/05/2005, 23h38
  4. Cocher/Decocher Checkbox
    Par HmL dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/03/2005, 13h34
  5. Cochage de plusieurs checkbox
    Par licorne dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 09/03/2005, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo