12 votes

Créer dynamiquement des préférences de cases à cocher

Je suis actuellement en train de créer une liste de lignes avec des cases à cocher de manière dynamique en utilisant le contenu d'un service web. Cependant, cette ListView devra faire à peu près ce qu'une PreferenceActivity accomplirait.

Je ne connais pas le nombre de lignes car le contenu est dynamique, je ne peux donc pas créer chaque CheckBoxPreference en XML. Comment puis-je procéder pour construire une PreferenceActivity qui affichera un nombre inconnu de lignes avec des CheckBoxPreference dynamiquement?

27voto

plowman Points 5106

Je pense que vous cherchez quelque chose comme ceci :

public class MyPreferenceActivity extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.my_preference_activity);

        //fetch the item where you wish to insert the CheckBoxPreference, in this case a PreferenceCategory with key "targetCategory"
        PreferenceCategory targetCategory = (PreferenceCategory)findPreference("targetCategory");

        //create one check box for each setting you need
        CheckBoxPreference checkBoxPreference = new CheckBoxPreference(this);
        //make sure each key is unique  
        checkBoxPreference.setKey("keyName");
        checkBoxPreference.setChecked(true);

        targetCategory.addPreference(checkBoxPreference);
    }
}

8voto

dmmh Points 1124

Eh bien @Jodes, en fait vous avez tous les deux raison, mais la bonne manière de le faire serait d'utiliser un ListPreference.

Je préfère une approche entièrement programmatique, d'après mon expérience c'est plus facile d'être cohérent ; soit créer une mise en page XML entière via du code, soit via XML, mais mélanger les deux peut être étrange et vous ne pouvez pas tout modifier via XML...

onCreate(){
    this.setPreferenceScreen(createPreferenceHierarchy());
}

public PreferenceScreen createPreferenceHierarchy(){
    PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this);

    // catégorie 1 créée de manière programmatique
    PreferenceCategory cat1 = new PreferenceCategory(this);
    cat1.setTitle("titre");
    root.addPreference(cat1);

    ListPreference list1 = new ListPreference(this);
    list1.setTitle(getResources().getString(R.string.some_string_title));
    list1.setSummary(getResources().getString(R.string.some_string_text));      
    list1.setDialogTitle(getResources().getString(R.string.some_string_pick_title));
    list1.setKey("your_key");

    CharSequence[] entries  = calendars.getCalendars(); //ou n'importe quoi d'autre qui retourne les bonnes données
    list1.setEntries(entries);
    int length              = entries.length;
    CharSequence[] values   = new CharSequence[length];
    for (int i=0; i

``

Cependant, en utilisant cette approche, vous allez vous heurter aux limitations de la plateforme qui n'a pas de ListPreference à sélection multiple, et vous voudrez probablement implémenter autre chose.

J'ai trouvé cette solution, qui fonctionne très bien. Vous devrez lire les commentaires pour trouver des indices sur comment déboguer le code cependant...

``

0voto

Jodes Points 3601

Vous avez besoin d'un ListView pour cela, d'une PreferenceActivity. Comme discuté dans ce lien, PreferenceActivity ne devrait être utilisé que pour enregistrer effectivement les préférences.

À la place, vous pourriez créer une simple boîte de dialogue avec des options de choix simples ou multiples : http://developer.android.com/guide/topics/ui/dialogs.html

Ou utilisez un ListView comme dans les exemples d'API fournis par Google, ils donnent un exemple simple :

http://hi-android.info/docs/resources/samples/ApiDemos/src/com/example/android/apis/view/List10.html

0voto

HocineHamdi Points 109

Utilisez PreferenceFragmentCompat de la bibliothèque Preference Compat

compile 'com.android.support:preference-v7:23.4.0'

Vérifiez cet article pour les détails de mise en œuvre https://medium.com/@arasthel92/dynamically-creating-preferences-on-android-ecc56e4f0789#.71ssvjses

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X