2010-10-07 81 views
0

J'ai passé plus d'une semaine à essayer de trouver une façon de faire une liste de préférences de sélection multiple limité. Rien que j'ai essayé fonctionne. Je suis prêt à abandonner sur Android si quelque chose d'apparemment simple est si difficile. Je programme depuis longtemps et ne me souviens pas d'avoir été si malmené par quelque chose comme ça. Je dois supposer que je ne comprends pas quelque chose de fondamental. J'espère que quelqu'un peut me diriger dans la bonne direction.Android: onPrepareDialogBuilder, onClick & setItemChecked

Voici le code le plus simple que je puisse penser qui devrait fonctionner. Cela ne supprime pas la case à cocher même si elle est définie sur false, j'ai également essayé de la corriger. Pourquoi ça ne marche pas? Si cela ne fonctionne pas, que va-t-il faire?

Toute aide serait grandement appréciée.

@Override 
    protected void onPrepareDialogBuilder(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"); 
     } 

     // Added by WJT since we are loading the entries values after instantiation 
     // we need the clicked indexes to be setup now, they would not have been 
     // set up in the constructor 
     if ((mClickedDialogEntryIndices == null) || (mClickedDialogEntryIndices.length == 0)) 
     mClickedDialogEntryIndices = new boolean[getEntries().length]; 

     restoreCheckedEntries(); 
     builder.setMultiChoiceItems(entries, mClickedDialogEntryIndices, 
       new DialogInterface.OnMultiChoiceClickListener() 
     { 
    public void onClick(DialogInterface dialog, int which, boolean val) 
    { 
    mDlg = (AlertDialog)getDialog(); 
       mListView = (ListView)mDlg.getListView(); 
    if (val) 
      { 
       if (mSelectedCount < mLimit) 
       { 
       mClickedDialogEntryIndices[which] = val; 
        mSelectedCount++; 

       } 
       else 
       { 
        mListView.setItemChecked(which, false); 
       Toast.makeText(getContext(), 
       R.string.newsLimitExceededMessage, 
       Toast.LENGTH_LONG).show(); 

       } // (mSelectedCount < mLimit) 

      } 
      else 
      { 
       mClickedDialogEntryIndices[which] = val; 
       mSelectedCount--; 

      } // (val) 

    } // void onClick(DialogInterface dialog, int which, boolean val) 


     }); // DialogInterface.OnMultiChoiceClickListener() 

    } // void onPrepareDialogBuilder(Builder builder) 

Merci,

\ ^/i l l

+0

Qu'est-ce que précisément "une liste de préférences multi-sélection limitées"? Qu'est-ce, spécifiquement, ne fonctionne pas? Quel est votre comportement attendu? Avez-vous envisagé d'utiliser une «activité» sur le thème des dialogues, où vous avez beaucoup plus de flexibilité? – CommonsWare

+0

@CommonsWare: Ce que j'essaie d'accomplir est une option de préférence qui permet à un utilisateur de sélectionner plusieurs éléments à partir d'une liste prédéfinie. Je veux limiter le nombre de ces éléments sélectionnés. Ma préférence serait de désactiver tous les éléments non sélectionnés une fois la limite atteinte, laissant les éléments sélectionnés activés. Je me contenterais de décocher chaque case au-dessus de la limite avec un message à l'utilisateur. –

+0

@CommonsWare: J'ai essayé de construire un ListView qui effectuerait la partie principale de cette opération sans succès une fois que j'aurais essayé de l'attacher au sous-système Preferences. C'est aussi proche que je l'ai fait pour une activité séparée. Dans le code ci-dessus, j'essaie simplement de décocher une case qui dépasse la limite prédéfinie de cases à cocher autorisées. Cela ne décoche pas la case à cocher. –

Répondre

0

Voici comment j'aborder le problème:

Étape # 1: Obtenir ce travail dans une activité de test jetable autonome. Oubliez les préférences. Oubliez les boîtes de dialogue. Concentrez-vous sur la fonctionnalité d'avoir un CHOICE_MODE_MULTIPLEListView où, après un certain nombre d'éléments sont vérifiés, les éléments non cochés sont désactivés. Étape # 2: Obtenez la fonctionnalité de l'étape 1 fonctionnant sous la forme d'un widget personnalisé. Par ceci, je veux dire que vous implémenteriez une sous-classe de ListView (je suppose ... pourrait être un conteneur s'il y a plus qu'un ListView) qui cuit tout ce dont vous avez besoin de l'étape 1. Étape # 3: Créez une sous-classe personnalisée DialogPreference qui utilise le widget personnalisé de l'étape 2. Par exemple, here is a sample project où j'ai un widget personnalisé ColorMixer, roulé dans un ColorPreference.

+0

Merci, à un moment donné, j'ai commencé avec votre échantillon de mélangeur de couleurs. Je vais revenir à quelque chose comme ça et voir si j'ai plus de succès. Merci pour la contribution! –

+0

Merci de m'avoir aidé à m'y installer et recommencer. En suivant vos pas m'a aidé à arriver au point où je l'ai fonctionné. Ce n'est pas parfait mais ça marche et pour l'instant c'est assez bien. :) –