2010-07-15 52 views
2

我有2個首選項 - 歌曲標題和我想要存儲在同一個鍵中的音頻狀態(靜音或音量)。這適用於點擊和唯一的問題是重置onSharedPreferencesChanged摘要我得到這個錯誤。使用android我希望使用相同的鍵有2個首選項

PreferenceScreen musicPrefScreen = (PreferenceScreen)getPreferenceScreen 
     ().findPreference("theme" + Team_ID); 
musicPrefScreen.setSummary(mPreferences.getString("theme" + 
     Team_ID, "CantGetTeam")); 
ListPreference audiostatePref = (ListPreference)getPreferenceScreen() 
     .findPreference("theme" + Team_ID); 
audiostatePref.setSummary(AudioState); 
audiostatePref.setEntryValues(audiostates_values); 

因爲findPreference的第二次調用返回第一個Pref。文檔說,你可以在第一個調用findPreference來獲得第二個,但他們是不同類型的首選項,我得到一個轉換錯誤。是否有另一種方法來查找ListPreference,以便我可以重置列表中的條目值?

編輯: 這裏是佈局

public PreferenceScreen createPreferenceHierarchy() { 
    PreferenceScreen prefScreenRoot = getPreferenceManager().createPreferenceScreen(this); 

    PreferenceCategory TeamCategory = new PreferenceCategory(this); 
    TeamCategory.setTitle("Team " + Team_ID + " Settings"); 
    prefScreenRoot.addPreference(TeamCategory); 
     // set team name 
     EditTextPreference teamnamePref = new EditTextPreference(this); 
     teamnamePref.setTitle("Team Name"); 
     teamnamePref.setKey("team" + Team_ID); 
     teamnamePref.setSummary(TheTeamName); 
     teamnamePref.setDialogTitle("Enter Name For Team " + Team_ID); 
     teamnamePref.setDefaultValue(TheTeamName); 
     teamnamePref.getEditText().setSingleLine(true); 
     TeamCategory.addPreference(teamnamePref); 

     // select theme music 
     PreferenceScreen musicPrefScreen = getPreferenceManager().createPreferenceScreen(this); 
     Intent musicIntent = new Intent(this, MusicDroid.class); 
     musicIntent.putExtra("team_id", Team_ID); 
     musicPrefScreen.setIntent(musicIntent); 
     musicPrefScreen.setKey("theme" + Team_ID); 
     musicPrefScreen.setTitle("Theme Music"); 
     musicPrefScreen.setSummary(TheThemeName); 
     TeamCategory.addPreference(musicPrefScreen); 

     // select audio state 
     ListPreference audiostatePref = new ListPreference(this); 
     audiostatePref.setTitle("Audio State"); 
     audiostatePref.setKey("theme" + Team_ID); 
     audiostatePref.setSummary(AudioState); // 
     audiostatePref.setEntries(audiostates); 
     audiostatePref.setEntryValues(audiostates_values); 
     TeamCategory.addPreference(audiostatePref); 

    return prefScreenRoot; 
} 

回答

0

文檔說你可以調用第一findPreference獲得第二個

你可以,但你做錯了。你仍然在主屏幕上調用find。

您需要明確調用檢索到的首選項屏幕,因爲您需要進一步解剖。

ListPreference audiostatePref = (ListPreference)musicPrefScreen.findPreference("theme" + Team_ID); 
+0

該行在Eclipse中沒有錯誤,但確切的一行將引發拋出錯誤。 java.lang.ClassCastException:android.preference.PreferenceScreen第一個pref是PreferenceScreen,它使用intent加載SD卡上的所有歌曲。第二個是一個簡單的ListPreference,它只返回默認,音樂或靜音三個狀態中的一個。 – 2010-07-15 13:14:38

+0

發佈您的首選項屏幕布局。 – Pentium10 2010-07-15 13:24:43

+0

好的,我做到了。我可以將一些首選項添加到SharedPrefs,並以不同的方式執行此操作。這只是代碼工作正常,我做的最後一件事是在onSharedPreferencesChanged中設置了摘要。我也需要在那裏更新setEntryValues。 – 2010-07-15 14:00:50

0

你傳遞一個Object到setSummary(),它接受一個int。您可能會遇到錯誤,因爲您將其設置爲int。在這裏猜測,似乎缺少一些代碼。

1

我無法通過使用findPreference使其正常工作。

然而,PreferenceGroup有方法,通過內部的所有喜好迭代:

  • getPreferenceCount()
  • getPreference(int index)

所以我只是寫了一個方法,它遍歷組的所有喜好,只返回給定鍵的偏好:

private List<Preference> findPreferences(PreferenceGroup group, String key) { 
    List<Preference> prefs = new ArrayList<>(); 
    for (int index = 0; index < group.getPreferenceCount(); index++) { 
     Preference pref = group.getPreference(index); 
     if (key.equals(pref.getKey())) { 
      prefs.add(pref); 
     } 
    } 
    return prefs 
} 
相關問題