使用android我希望有2个首选项使用相同的密钥

时间:2010-07-15 08:07:16

标签: android listpreference preferencescreen

我有两个prefs - 一个歌曲标题和音频状态(静音或音量),我想要存储在同一个键中。这适用于点击,我唯一的问题是重置onSharedPreferencesChanged上的摘要我得到错误。

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得到第二个,但它们是不同类型的prefs,我得到一个强制转换错误。是否有其他方法可以找到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;
}

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

  

文档说你可以在第一个调用findPreference来获得第二个

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

您需要在检索到的偏好设置屏幕上明确调用,因为您希望进一步解剖它。

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

答案 2 :(得分:0)

您将Object传递给setSummary(),它需要int。您可能会收到错误,因为您将其转换为int。只是在这里猜测,似乎缺少一些代码。