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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    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 averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    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 éclairé
    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
    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 averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    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 éclairé
    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
    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 averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 46
    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

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