2014-07-25 35 views
1

我顯示一個可選列表與所有可啓動安裝的應用程序。我不想保存選擇,但ListPreference保存了所有列出的條目。Android的ListPreference不保存選擇

我的錯誤在哪裏?

這裏是我的ListPreference:

公共類SettingsSelectsApps擴展ListPreference {

private String separator; 
private static final String DEFAULT_SEPARATOR = "\u0001\u0007\u001D\u0007\u0001"; 
private boolean[] entryChecked; 

public SettingsSelectsApps(Context context, AttributeSet attributeSet) { 
    super(context, attributeSet); 
    loadEntries(); 
    entryChecked = new boolean[getEntries().length]; 
    separator = DEFAULT_SEPARATOR; 
} 

public SettingsSelectsApps(Context context) { 
    this(context, null); 
} 

private void loadEntries() { 

    final Context context = getContext(); 

    final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
    mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 

    final List<ResolveInfo> pkgAppsList = context.getPackageManager().queryIntentActivities(mainIntent, 0); 

    CharSequence[] entries = new CharSequence[pkgAppsList.size()]; 
    CharSequence[] entryValues = new CharSequence[pkgAppsList.size()]; 

    int j = 0; 

    for (ResolveInfo P : pkgAppsList) { 
     entryValues[j] = (CharSequence) P.getClass().getName(); 
     entries[j] = P.loadLabel(context.getPackageManager()); 
     ++j; 
    }; 

    setEntries(entries); 
    setEntryValues(entryValues); 
} 

@Override 
protected void onPrepareDialogBuilder(Builder builder) { 
    CharSequence[] entries = getEntries(); 
    CharSequence[] entryValues = getEntryValues();  

    if (entries == null || entryValues == null || entries.length != entryValues.length) { 
     throw new IllegalStateException(
       "MultiSelectListPreference requires an entries array and an entryValues " 
         + "array which are both the same length"); 
    } 

    restoreCheckedEntries(); 
    OnMultiChoiceClickListener listener = new DialogInterface.OnMultiChoiceClickListener() { 
     public void onClick(DialogInterface dialog, int which, boolean val) { 
      entryChecked[which] = val; 
     } 
    }; 
    builder.setMultiChoiceItems(entries, entryChecked, listener); 
} 

private CharSequence[] unpack(CharSequence val) { 
    if (val == null || "".equals(val)) { 
     return new CharSequence[0]; 
    } else { 
     return ((String) val).split(separator); 
    } 
} 

public CharSequence[] getCheckedValues() { 
    return unpack(getValue()); 
} 

private void restoreCheckedEntries() { 
    CharSequence[] entryValues = getEntryValues(); 
    CharSequence[] vals = unpack(getValue()); 

    if (vals != null) { 
     List<CharSequence> valuesList = Arrays.asList(vals); 
     for (int i = 0; i < entryValues.length; i++) { 
      CharSequence entry = entryValues[i]; 
      entryChecked[i] = valuesList.contains(entry); 
     } 
    } 

    SharedPreferences prefs = getSharedPreferences(); 
    try{ 
     Map<String,?> keys = prefs.getAll(); 

     for(Map.Entry<String,?> entry : keys.entrySet()){   
     } 
    } catch(NullPointerException e) { 
     Log.d("map values","Error: "+e); 
    } 
} 

@Override 
protected void onDialogClosed(boolean positiveResult) { 
    List<CharSequence> values = new ArrayList<CharSequence>(); 

    CharSequence[] entryValues = getEntryValues(); 
    if (positiveResult && entryValues != null) { 
     for (int i = 0; i < entryValues.length; i++) { 
      if (entryChecked[i] == true) { 
       String val = (String) entryValues[i]; 
       values.add(val); 
      } 
     } 

     String value = join(values, separator); 
     setSummary(prepareSummary(values)); 
     setValueAndEvent(value); 
    } 
} 

private void setValueAndEvent(String value) { 
    if (callChangeListener(unpack(value))) { 
     setValue(value); 
    } 
} 

private CharSequence prepareSummary(List<CharSequence> joined) { 
    List<String> titles = new ArrayList<String>(); 
    CharSequence[] entryTitle = getEntries(); 
    CharSequence[] entryValues = getEntryValues(); 
    int ix = 0; 
    for (CharSequence value : entryValues) { 
     if (joined.contains(value)) { 
      titles.add((String) entryTitle[ix]); 
     } 
     ix += 1; 
    } 
    return join(titles, ", "); 
} 

@Override 
protected Object onGetDefaultValue(TypedArray typedArray, int index) { 
    return typedArray.getTextArray(index); 
} 

@Override 
protected void onSetInitialValue(boolean restoreValue, 
     Object rawDefaultValue) { 
    String value = null; 
    CharSequence[] defaultValue; 
    if (rawDefaultValue == null) { 
     defaultValue = new CharSequence[0]; 
    } else { 
     defaultValue = (CharSequence[]) rawDefaultValue; 
    } 
    List<CharSequence> joined = Arrays.asList(defaultValue); 
    String joinedDefaultValue = join(joined, separator); 
    if (restoreValue) { 
     value = getPersistedString(joinedDefaultValue); 
    } else { 
     value = joinedDefaultValue; 
    } 

    setSummary(prepareSummary(Arrays.asList(unpack(value)))); 
    setValueAndEvent(value); 
} 

protected static String join(Iterable<?> iterable, String separator) { 
    Iterator<?> oIter; 
    if (iterable == null || (!(oIter = iterable.iterator()).hasNext())) 
     return ""; 
    StringBuilder oBuilder = new StringBuilder(String.valueOf(oIter.next())); 
    while (oIter.hasNext()) 
     oBuilder.append(separator).append(oIter.next()); 
    return oBuilder.toString(); 
} 

}

回答

0

我相信你使用代碼this gist除了分離器的偉大工程。我不知道作者爲什麼選擇分隔符爲"\u0001\u0007\u001D\u0007\u0001"

一旦我試圖將分隔符更改爲任何其他字符串,例如",,"一切正常。

選擇的分隔符字符串似乎會導致android無法解析共享首選項xml文檔。