Java 来自代码的MultiSelectListPreference

Java 来自代码的MultiSelectListPreference,java,android,sharedpreferences,preferenceactivity,Java,Android,Sharedpreferences,Preferenceactivity,我想知道如何在代码中使用MultiSelectListPreferencepreference 下面的代码取自API示例文件PreferencesFromCode.java,如果有人能为MultiSelectListPreference提供类似的示例,您将成为我的一天:) 我在网上找不到任何例子,但我把这些放在一起,它就起作用了 编辑:此解决方案仅适用于ICS+。蜂巢完全忽略.setValues(),传递给侦听器的哈希集包含不同的值。这是一个已知的bug,但我希望这将帮助希望在Android v

我想知道如何在代码中使用MultiSelectListPreferencepreference

下面的代码取自API示例文件PreferencesFromCode.java,如果有人能为MultiSelectListPreference提供类似的示例,您将成为我的一天:)


我在网上找不到任何例子,但我把这些放在一起,它就起作用了

编辑:此解决方案仅适用于ICS+。蜂巢完全忽略.setValues(),传递给侦听器的哈希集包含不同的值。这是一个已知的bug,但我希望这将帮助希望在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);
MultiSelectListPreference listPreference=新的MultiSelectListPreference(上下文);
setTitle(R.string.configure\u category\u title);
listPreference.setDialogTitle(R.string.configure_category_title);
listPreference.setSummary(R.string.configure\u category\u summary);
setEntries(R.array.configure_category_array);
listPreference.setEntryValues(新的CharSequence[]{
ProcessList.PREF_服务+mAppWidgetId,
ProcessList.PREF_非活动+mAppWidgetId,
ProcessList.PREF_内部+mAppWidgetId
});
//创建一个集合,其中包含应选择的列表项
SharedReferences SharedReferences=PreferenceManager.GetDefaultSharedReferences(上下文);
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);
字符串[]字符串=新字符串[3];
int-cnt=0;
if(展示服务)
strings[cnt++]=ProcessList.PREF_SERVICES+mAppWidgetId;
如果(显示不活动)
字符串[cnt++]=ProcessList.PREF_INACTIVE+mAppWidgetId;
如果(显示内部)
strings[cnt]=ProcessList.PREF_INTERNAL+mAppWidgetId;
Set mySet=newhashset();
Collections.addAll(mySet,strings);
//添加集合
setValues(mySet);
//倾听变化,我不确定这是否是它的工作方式,但它确实:/
listPreference.setOnPreferenceChangeListener(新的Preference.OnPreferenceChangeListener(){
公共布尔onPreferenceChange(首选项,对象o){
HashSet HashSet=(HashSet)o;
迭代器stringIterator=hashSet.Iterator();
布尔[]状态={false,false,false};
字符串预处理字符串;
while(stringIterator.hasNext()){
prefString=(String)stringIterator.next();
if(prefString==null)
继续;
if(prefString.compareTo(ProcessList.PREF_服务+mAppWidgetId)==0)
状态[0]=真;
else if(prefString.compareTo(ProcessList.PREF_INACTIVE+mAppWidgetId)==0)
状态[1]=真;
else if(prefString.compareTo(ProcessList.PREF_INTERNAL+mAppWidgetId)==0)
状态[2]=真;
}
优先权经理
.GetDefaultSharedReferences(getActivity())
.edit()
.putBoolean(ProcessList.PREF_服务+mAppWidgetId,状态[0])
.putBoolean(ProcessList.PREF_INACTIVE+mAppWidgetId,状态[1])
.putBoolean(ProcessList.PREF_INTERNAL+mAppWidgetId,states[2])
.commit();
返回true;
}
});
preferenceCategory.addPreference(listPreference);

我在网上找不到任何例子,但我把这些放在一起,它就起作用了

编辑:此解决方案仅适用于ICS+。蜂巢完全忽略.setValues(),传递给侦听器的哈希集包含不同的值。这是一个已知的bug,但我希望这将帮助希望在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);
MultiSelectListPreference listPreference=新的MultiSelectListPreference(上下文);
setTitle(R.string.configure\u category\u title);
listPreference.setDialogTitle(R.string.configure_category_title);
listPreference.setSummary(R.string.configure\u category\u summary);
setEntries(R.array.configure_category_array);
listPreference.setEntryValues(新的CharSequence[]{
ProcessList.PREF_服务+mAppWidgetId,
ProcessList.PREF_非活动+mAppWidgetId,
ProcessList.PREF_内部+mAppWidgetId
});
//创建一个集合,其中包含应选择的列表项
SharedReferences SharedReferences=PreferenceManager.GetDefaultSharedReferences(上下文);
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);
字符串[]字符串=新字符串[3];
int-cnt=0;
if(展示服务)
strings[cnt++]=ProcessList.PREF_SERVICES+mAppWidgetId;
如果(显示不活动)
字符串[cnt++]=ProcessList.PREF_INACTIVE+mAppWidgetId;
如果(显示内部)
strings[cnt]=ProcessList.PREF_INTERNAL+mAppWidgetId;
Set mySet=newhashset();
Collections.addAll(mySet,strings);
//添加集合
setValues(mySet);
//倾听变化,我不确定这是否是它的工作方式,但它确实:/
listPreference.setOnPreferenceChangeListener(新的Preference.OnPreferenceChangeListener(){
公共布尔onPreferenceChange(首选项,对象o){
HashSet HashSet=(HashSet)o;
迭代器stringIterator=hashSet.Iterator();
布尔[]状态={false,false,false};
字符串预处理字符串;
while(stringIterator.hasNext()){