Динамически создавать CheckBoxPreferences - PullRequest
12 голосов
/ 08 июня 2011

В настоящее время я строю список строк с флажками динамически, используя контент из веб-службы.Однако, этому ListView нужно будет сделать в значительной степени то, чего достиг бы PreferenceActivity.

Я не знаю количество строк, так как содержимое является динамическим, поэтому я не могу создать каждый CheckBoxPreference в XML.Как мне построить PreferenceActivity, который будет отображать строки с неизвестным числом динамически с CheckBoxPreference?

Ответы [ 4 ]

27 голосов
/ 02 июля 2011

Я думаю, вы ищете что-то вроде этого:

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);
    }
}
8 голосов
/ 01 августа 2012

Хорошо @Джодес, на самом деле вы оба правы, но правильный способ сделать это - использовать ListPreference.

Я бы использовал весь программный подход, из моего опыта легче быть последовательным; Либо создайте полный макет XML с помощью кода, либо с помощью XML, но смешивание 2 может быть странным, и вы не можете изменить все, что установлено с помощью XML ...

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

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

    // category 1 created programmatically
    PreferenceCategory cat1 = new PreferenceCategory(this);
    cat1.setTitle("title");
    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.getCalenders(); //or anything else that returns the right data
    list1.setEntries(entries);
    int length              = entries.length;
    CharSequence[] values   = new CharSequence[length];
    for (int i=0; i<length; i++){
        CharSequence val = ""+i+1+"";
        values[i] =  val;
    }
    list1.setEntryValues(values);

    cat1.addPreference(list1);

    return root;
}//end method

Однако, используя этот подход, вы столкнетесь с ограничениями платформы отсутствием множественного выбора ListPreference, и, возможно, вам захочется реализовать что-то еще.

Я нашел это решение, которое прекрасно работает. Вы должны будете прочитать комментарии, чтобы найти подсказки о том, как отладить код, хотя ...

0 голосов
/ 09 июня 2016

Использовать PreferenceFragmentCompat из библиотеки предпочтений Compat

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

В этой статье приведены подробности реализации https://medium.com/@arasthel92/dynamically-creating-preferences-on-android-ecc56e4f0789#.71ssvjses

0 голосов
/ 08 июня 2011

Для этого вам нужно ListView, PreferenceActivity. Как обсуждалось в , эту ссылку , PreferenceActivity следует использовать только для фактического сохранения настроек.

Вместо этого вы можете создать простой диалог с одним или несколькими вариантами выбора: http://developer.android.com/guide/topics/ui/dialogs.html

Или используйте ListView, как в примерах API, которые предоставляет Google, они дают простой пример:

http://hi -android.info / документы / ресурсы / образцы / ApiDemos / SRC / COM / пример / Android / APIs / вид / List10.html

...