对于android,我希望有两个相同键的首选项
我有两个prefs-一首歌的标题和音频状态(静音或音量),我想存储在同一个键。这对点击有效,我唯一的问题是重置onSharedPreferencesChanged上的摘要。我发现了错误对于android,我希望有两个相同键的首选项,android,listpreference,preferencescreen,Android,Listpreference,Preferencescreen,我有两个prefs-一首歌的标题和音频状态(静音或音量),我想存储在同一个键。这对点击有效,我唯一的问题是重置onSharedPreferencesChanged上的摘要。我发现了错误 PreferenceScreen musicPrefScreen = (PreferenceScreen)getPreferenceScreen ().findPreference("theme" + Team_ID); musicPrefScreen.setSummary(mPreferenc
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);
因为对FindReference的第二次调用返回第一个Pref。文档说可以在第一次调用FindReference来获取第二个Pref,但它们是不同类型的Pref,我得到了一个强制转换错误。是否有其他方法可以找到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;
}
医生说,你可以在第一次呼叫FindReference来获取第二次
你可以,但你做错了。您仍然可以在主屏幕上调用find
您需要在检索到的首选项屏幕上显式调用,因为您想要进一步剖析它
ListPreference audiostatePref = (ListPreference)musicPrefScreen.findPreference("theme" + Team_ID);
您正在将一个
对象
传递给setSummary(),它需要一个int
。您可能会收到错误,因为您将其强制转换为int
。只是猜测一下,这里似乎缺少一些代码。我无法使用findReference
使其正常工作
但是,PreferenceGroup
中有迭代所有首选项的方法:
getPreferenceCount()
getPreference(int索引)
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
}
私有列表查找引用(首选项组,字符串键){
List prefs=new ArrayList();
对于(int index=0;index
在Eclipse中,该行是无错误的,但该行会抛出强制转换错误。java.lang.ClassCastException:android.preference.PreferenceScreen第一个pref是PreferenceScreen,它使用intent在SD卡上加载所有歌曲。第二个是一个简单的ListPreference,它只返回默认、音乐或静音三种状态中的一种。我可以向SharedPref添加一些首选项,并以不同的方式执行此操作。只是代码运行良好,我做的最后一件事是在onSharedPreferencesChanged中设置摘要。我还需要更新那里的setEntryValues。