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
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
@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. –
@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. –