2017-08-06 128 views
4

我有一個帶有MultiSelectListPreference的Android應用程序,我使用onPreferenceChange()方法來更新首選項摘要。我設法編寫了基於newValues參數更新摘要的代碼,但Object的內容與用戶選擇的實際選項不匹配。MultiSelectListPreference onPreferenceChange()方法獲取錯誤參數

這裏是我的代碼:

public boolean onPreferenceChange(Preference preference, Object newValue) { 
    if (preference instanceof MultiSelectListPreference) { 
     List<String> newValues = new ArrayList<>((HashSet<String>) newValue); 

     MultiSelectListPreference pref = (MultiSelectListPreference) preference; 
     ArrayList<String> newSummary = new ArrayList<>(); 

     ArrayList<CharSequence> values = new ArrayList<>(Arrays.asList(pref.getEntryValues())); 

     for (int i = 0; i < newValues.size(); i++) { 
      int currentIndex = findIndexOfString(values, newValues.get(i).replaceAll(" ", "")); 

      String title = (currentIndex >= 0) ? pref.getEntries()[currentIndex].toString().replaceAll(" ", "") : ""; 

      newSummary.add(title); 
     } 

     pref.setSummary(TextUtils.join(", ", newSummary)); 
    } 

    return true; 
} 

private static int findIndexOfString(List<CharSequence> list, String s) { 
    for (int i = 0; i < list.size(); i++) { 
     if (s.equals(list.get(i).toString().replaceAll(" ", ""))) { 
      return i; 
     } 
    } 

    return -1; 
} 

回答

1

這是我使用基於newValue對象設置彙總包含存儲爲偏好值代碼onPreferenceChange()接收。 (對摘要不太好)

public boolean onPreferenceChange(Preference preference, Object newValue) { 
    if (preference instanceof MultiSelectListPreference) { 
     List<String> newValues = new ArrayList<>((HashSet<String>) newValue); 

     pref.setSummary(TextUtils.join(", ", getSummaryListFromValueList(newValues))); 
    } 

    return true; 
} 

private List<String> getSummaryListFromValueList(List<String> valueList) { 
     String[] allSummaries = getResources().getStringArray(R.array.pref_notif); 
     String[] allValues = getResources().getStringArray(R.array.pref_notif_values); 

     List<String> summaryList = new ArrayList<>(); 
     for (int i = 0; i < allValues.length; i++) { 
      for (String value : valueList) { 
       if (allValues[i].equals(value)) { 
        summaryList.add(allSummaries[i]); 
       } 
      } 
     } 
     return summaryList; 
    }