Динамически создавать CheckBoxPreferences
В настоящее время я строю список строк с флажками динамически, используя контент из веб-службы. Тем не менее, этот ListView
должен будет сделать в значительной степени то, что выполнил PreferenceActivity
.
Я не знаю количество строк, поскольку содержимое является динамическим, поэтому я не могу создать каждый CheckBoxPreference
в XML. Как я могу построить PreferenceActivity
, который будет динамически отображать строки с неизвестными номерами с CheckBoxPreference
?
Ответы
Ответ 1
Я думаю, что вы ищете что-то вроде этого:
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);
}
}
Ответ 2
Ну @Jodes, на самом деле вы оба правы, но правильный способ сделать это будет использовать 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
, и вы, вероятно, захотите реализовать что-то еще.
Я нашел это решение, которое отлично работает. Вам нужно будет прочитать комментарии, чтобы найти подсказки о том, как отлаживать код, хотя...
Ответ 3
Для этого вам нужен ListView
, a PreferenceActivity
. Как обсуждалось в этой ссылке, PreferenceActivity
следует использовать только для фактических настроек сохранения.
Вместо этого вы можете либо создать простой диалог с одним или несколькими вариантами выбора:
http://developer.android.com/guide/topics/ui/dialogs.html
Или используйте ListView
, как в примерах API, которые предоставляет Google, они дают простой пример:
http://hi-android.info/docs/resources/samples/ApiDemos/src/com/example/android/apis/view/List10.html
Ответ 4
Использовать PreferenceFragmentCompat из библиотеки сопоставления предпочтений
compile 'com.android.support:preference-v7:23.4.0'
Проверьте эту статью для деталей реализации https://medium.com/@arasthel92/dynamically-creating-preferences-on-android-ecc56e4f0789#.71ssvjses