Schlechtes Gefühl bei SharedPreference

  • Antworten:2
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 421

06.06.2021, 12:14:01 via Website

Hallo zusammen

Nur mal so Fragen ob jemand eine bessere Idee hat.
In meiner App verwende ich für die Optionen ein "SharedPreference". Die habe ich wie folgt gemacht:

package ch.robbisoft.sun_app;

import android.content.SharedPreferences;
import android.os.Bundle;

import androidx.preference.ListPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;

public class SettingsFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener {

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    addPreferencesFromResource(R.xml.preferences);
    //Setzen der Anzeigeoptionen
    ListPreference wer = findPreference("key_anzeige");
    CharSequence[] entries = { getString(R.string.lbl_grad), getString(R.string.lbl_gradminuten), getString(R.string.lbl_gradminutensekunden) };
    CharSequence[] entryValues = { "grd", "grdmin", "grdminsek" };
    wer.setEntries(entries);
    wer.setEntryValues(entryValues);
    //Eingabe anzeigen
    onSharedPreferenceChanged(getPreferenceManager().getSharedPreferences(), "key_distanz");
    onSharedPreferenceChanged(getPreferenceManager().getSharedPreferences(), "key_anzeige");
}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Preference wo = findPreference(key);
    if(key.equals("key_anzeige") || key.equals("key_distanz")) {
        wo.setSummary(sharedPreferences.getString(key, " - "));
    }
}

@Override
public void onResume() {
    super.onResume();
    getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
    getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    super.onPause();
}

}

Die Methode "onSharedPreferenceChanged" gefällt mir nicht. Denn ich muss entscheiden welche Option geändert wurde. Denn bei Switches stürzt das ganze ab.

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Preference wo = findPreference(key);
if(key.equals("key_anzeige") || key.equals("key_distanz")) {
wo.setSummary(sharedPreferences.getString(key, " - "));
}
}

Kann man das nicht anders oder besser lösen?

Gruss Renato

Diskutiere mit!
Beste Antwort
  • Forum-Beiträge: 11.182

06.06.2021, 18:02:16 via Website

Hallo Renato,

ich vermute du willst immernoch deine Eingabe in den Prefs als Summary setzen.

Dazu gibt es mehrere Ansätze:

  1. einzelne OnPreferenceChangeListener bzw. einer für mehrere zusammen aber nicht für alle
  2. Definieren einer Liste, für welche Preferences das gelten soll und dann statt if(key.equals(..)) myList.Contains(key)) nehmen.

Allerdings ist Option1 am besten:

OnPreferenceChangeListener setSummaryListener = new OnPreferenceChangeListener() {

            @Override
            public boolean onPreferenceChange(Preference preference,
                                              Object newValue) {

                                          preference.setSummary(newValue.toString()); //evtl überprüfen ob newValue wirklich ein string ist.

                return true;

            }
        });


und dann brauchst du nur:

Preference diszanz = findPreference("key_distanz");
Preference anzeige = findPreference("key_anzeige");
distanz.setOnPreferenceChangeListener(setSummaryListener);
anzeige.setOnPreferenceChangeListener(setSummaryListener)
distanz.setSummary(...); //initial setzen
anzeige.setSummary(...); //initial setzen

So müsste beim öffnen der Ativity direkt die passende Summary angezeigt werden (verursacht durch setSummary) und beim ändern enrsprechend durch den OnChangeListener, welcher eben nur für Preferences gilt, wo du diesen auch gesetzt hast.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 421

13.06.2021, 13:44:18 via Website

Ciao Pascal

Danke für die Hilfe.
Dachte ichs mir, dass es bessere Lösungen gibt.

Gruss Renato

Hilfreich?
Diskutiere mit!