android - 使用 android 我希望有 2 个首选项具有相同的键

标签 android listpreference preferencescreen

我有 2 个首选项 - 歌曲名称和音频状态(静音或音量),我想将它们存储在同一个键中。这适用于点击,我遇到的唯一问题是重置 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 来获得第二个,但它们是不同类型的首选项,我得到一个转换错误。是否有另一种方法可以找到 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;
}

最佳答案

我无法使用 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
}

关于android - 使用 android 我希望有 2 个首选项具有相同的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3253616/

相关文章:

Android ListPreference - 在列表项选择上执行方法?

android - 在 PreferenceScreen 中检索 ListPreference

android - 如何截断 TextView,在 Android Studio 中的 TextView 末尾留下一定数量的字符?

java - 如何使用 Android Studio 计算 Java 中的总和

android - Retrofit + rxandroid 导致 kitkat 出现 stackoverflow 错误

java - 如何更新列表首选项摘要(findPreference() 不起作用)?

java - 如何在onSaveInstanceState中保存两个webview?

java - 更改 Listpreference 中的 rowHight

android - 动态更改 Custom PreferenceScreen 的数据

java - 警报对话框中的首选项 Activity