从code MultiSelectList preferencecode、MultiSelectList、preference

2023-09-06 11:29:32 作者:焦糖绵绵冰

我想知道如何使用 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); 

2. Java的一些课堂笔记

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);