我想知道如何使用 MultiSelectList preference 在code preference。
以下code从API示例文件preferencesFrom code.java取,如果有人能够给出MultiSelectList preference一个类似的例子,你会让我的日子。)
//列表preference列表preference列表preF =新名单preference(本);名单pref.setEntries(R.array.entries_list_ preference);名单pref.setEntryValues(R.array.entryvalues_list_ preference);名单pref.setDialogTitle(R.string.dialog_title_list_ preference);名单pref.setKey(list_ preference);名单pref.setTitle(R.string.title_list_ preference);名单pref.setSummary(R.string.summary_list_ preference);dialogBased prefCat.add preference(名单preF);
解决方案
我找不到任何在线的例子,但我把这个在一起,它的工作原理。
编辑::此解决方案只能在ICS +工作。蜂窝完全忽略.setValues()和HashSet的传递到听者包含不同的值。这是一个已知的错误,但我希望这将有助于人们希望在Android的V4 +实施
MultiSelectList preference列表preference =新MultiSelectList preference(背景); 名单preference.setTitle(R.string.configure_category_title); 名单preference.setDialogTitle(R.string.configure_category_title); 名单preference.setSummary(R.string.configure_category_summary); 名单preference.setEntries(R.array.configure_category_array); 名单preference.setEntryValues(新的CharSequence [] { ProcessList中。preF_SERVICES + mAppWidgetId, ProcessList中。preF_INACTIVE + mAppWidgetId, ProcessList中。preF_INTERNAL + mAppWidgetId }); //创建一个集<串GT;与应选择的列表项 共享preferences共享preF = preferenceManager.getDefaultShared preferences(背景); 布尔showServices =共享pref.getBoolean(ProcessList中preF_SERVICES + mAppWidgetId,真正的); 布尔showInactive =共享pref.getBoolean(ProcessList中preF_INACTIVE + mAppWidgetId,真正的); 布尔showInternal =共享pref.getBoolean(ProcessList中preF_INTERNAL + mAppWidgetId,真正的); 的String [] =串新的String [3]; INT CNT = 0; 如果(showServices) 字符串[CNT ++] = ProcessList中preF_SERVICES + mAppWidgetId。 如果(showInactive) 字符串[CNT ++] = ProcessList中preF_INACTIVE + mAppWidgetId。 如果(showInternal) 字符串[CNT] = ProcessList中preF_INTERNAL + mAppWidgetId。 SET<串GT; MYSET =新的HashSet<串GT;(); Collections.addAll(MYSET,字符串); //添加组 名单preference.setValues(MYSET); //监听的变化,我不知道这是它的意思是如何工作的,但它的作用:/ 名单preference.setOn preferenceChangeListener(新preference.On preferenceChangeListener(){ 在preferenceChange公共布尔(preference preference,对象o){ HashSet的HashSet的=(的HashSet)O; 迭代器stringIterator = hashSet.iterator(); 布尔[] =状态{假的,假的,假}; 字符串prefString; 而(stringIterator.hasNext()){ prefString =(字符串)stringIterator.next(); 如果(prefString == NULL) 继续; 如果(prefString.compareTo(ProcessList中。preF_SERVICES + mAppWidgetId)== 0) 状态[0] =真; 否则,如果(prefString.compareTo(ProcessList中。preF_INACTIVE + mAppWidgetId)== 0) 美国[1] =真; 否则,如果(prefString.compareTo(ProcessList中。preF_INTERNAL + mAppWidgetId)== 0) 国家[2] =真; } preferenceManager .getDefaultShared preferences(getActivity()) 。编辑() .putBoolean(ProcessList中。preF_SERVICES + mAppWidgetId,状态[0]) .putBoolean(ProcessList中。preF_INACTIVE + mAppWidgetId,规定[1]) .putBoolean(ProcessList中。preF_INTERNAL + mAppWidgetId,国家[2]) 。承诺(); 返回true; } }); preferenceCategory.add preference(名单preference);
I would like to know how to use MultiSelectListPreference preference in code.
The following code is taken from the API examples file PreferencesFromCode.java, if someone could give a similar example for MultiSelectListPreference you would make my day :)
// List preference
ListPreference listPref = new ListPreference(this);
listPref.setEntries(R.array.entries_list_preference);
listPref.setEntryValues(R.array.entryvalues_list_preference);
listPref.setDialogTitle(R.string.dialog_title_list_preference);
listPref.setKey("list_preference");
listPref.setTitle(R.string.title_list_preference);
listPref.setSummary(R.string.summary_list_preference);
dialogBasedPrefCat.addPreference(listPref);
解决方案
I couldn't find any examples online, but I put this together and it works.
Edit: This solution will only work on ICS+. Honeycomb completely ignores .setValues() and the HashSet passed to the listener contains different values. This is a known bug, but I hope this will help people wanting to implement in Android v4+
MultiSelectListPreference listPreference = new MultiSelectListPreference(context);
listPreference.setTitle(R.string.configure_category_title);
listPreference.setDialogTitle(R.string.configure_category_title);
listPreference.setSummary(R.string.configure_category_summary);
listPreference.setEntries(R.array.configure_category_array);
listPreference.setEntryValues(new CharSequence[]{
ProcessList.PREF_SERVICES + mAppWidgetId,
ProcessList.PREF_INACTIVE + mAppWidgetId,
ProcessList.PREF_INTERNAL + mAppWidgetId
});
//Create a Set<String> with list items that should be selected
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
boolean showServices = sharedPref.getBoolean(ProcessList.PREF_SERVICES + mAppWidgetId, true);
boolean showInactive = sharedPref.getBoolean(ProcessList.PREF_INACTIVE + mAppWidgetId, true);
boolean showInternal = sharedPref.getBoolean(ProcessList.PREF_INTERNAL + mAppWidgetId, true);
String[] strings = new String[3];
int cnt = 0;
if (showServices)
strings[cnt++] = ProcessList.PREF_SERVICES + mAppWidgetId;
if (showInactive)
strings[cnt++] = ProcessList.PREF_INACTIVE + mAppWidgetId;
if (showInternal)
strings[cnt] = ProcessList.PREF_INTERNAL + mAppWidgetId;
Set<String> mySet = new HashSet<String>();
Collections.addAll(mySet, strings);
//Add the set
listPreference.setValues(mySet);
//Listen for changes, I'm not sure if this is how it's meant to work, but it does :/
listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
public boolean onPreferenceChange(Preference preference, Object o) {
HashSet hashSet = (HashSet) o;
Iterator stringIterator = hashSet.iterator();
boolean[] states = {false, false, false};
String prefString;
while (stringIterator.hasNext()) {
prefString = (String) stringIterator.next();
if (prefString == null)
continue;
if (prefString.compareTo(ProcessList.PREF_SERVICES + mAppWidgetId) == 0)
states[0] = true;
else if (prefString.compareTo(ProcessList.PREF_INACTIVE + mAppWidgetId) == 0)
states[1] = true;
else if (prefString.compareTo(ProcessList.PREF_INTERNAL + mAppWidgetId) == 0)
states[2] = true;
}
PreferenceManager
.getDefaultSharedPreferences(getActivity())
.edit()
.putBoolean(ProcessList.PREF_SERVICES + mAppWidgetId, states[0])
.putBoolean(ProcessList.PREF_INACTIVE + mAppWidgetId, states[1])
.putBoolean(ProcessList.PREF_INTERNAL + mAppWidgetId, states[2])
.commit();
return true;
}
});
preferenceCategory.addPreference(listPreference);
上一篇:Sitecore的包含损坏文件的排序顺序顺序、文件、Sitecore
下一篇:Android的ICS微调与actionbarsherlockAndroid、ICS、actionbarsherlock