Con Android voglio avere 2 preferenze con la stessa chiave
-
16-09-2020 - |
Domanda
Ho 2 prefs - un titolo di brano e lo stato audio (muto o volume) che voglio memorizzare nello stesso tasto.Funziona per i clic e l'unico problema che ho reimpostato il riepilogo su onsharedpreferenceschanged ottengo errori con questo.
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);
.
Perché la seconda chiamata a FindPreference restituisce il primo pref.I Documenti dicono che puoi chiamare FindPreference sul primo a ottenere il secondo ma sono diversi tipi di pref sono e ottengo un errore fuso.C'è un altro modo per trovare la libertà di listino in modo da poter ripristinare i valori di ingresso nell'elenco?
Modifica: Ecco il layout
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;
}
. Soluzione
.I Documenti dicono che puoi chiamare FindPreference sul primo a ottenere il secondo
puoi ma lo stai sbagliando.Hai ancora chiamato Trova sulla schermata principale.
È necessario chiamare esplicitamente sulla schermata di preferenza recuperata, come si desidera anatomizzare che ulteriormente.
ListPreference audiostatePref = (ListPreference)musicPrefScreen.findPreference("theme" + Team_ID);
. Altri suggerimenti
Non potevo farlo funzionare correttamente usando findPreference
.
Tuttavia, PreferenceGroup
ha metodi per iterati attraverso tutte le preferenze all'interno:
- .
-
getPreferenceCount()
-
getPreference(int index)
Quindi ho semplicemente scritto un metodo, che itera attraverso tutte le preferenze nel gruppo e restituisce solo le preferenze con la chiave data:
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
}
. Stai passando un Object
a setSummary (), che si aspetta un int
.Probabilmente stai ricevendo l'errore perché lo hai gettato per essere un int
.Solo indovinando qui, sembra che ci sia manca un codice.