Preference mit Switch

  • Antworten:4
  • Bentwortet
Robbiani Renato
  • Forum-Beiträge: 650

22.05.2023, 21:31:14 via Website

Hallo zusammen

Für die Optionen meiner App verwende ich den Preferencmanager. Das ging bisher ohne Probleme, da ich immer einen String ablegte.

Neu habe ich eine Swicht drin. Nun Stürzt die App ab wenn ich den Schalter umstelle.

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Preference wo = findPreference(key);
    if(wo != null) {
        if(key.compareTo("key_mute") != 0) {
            wo.setSummary(sharedPreferences.getString(key, " - "));
        }
    }
}

Das kann ich verstehen, da die Switch kein String enthält. Zur Not habe ich einfach den Key ausgeschlossen. Das geht so.

Aber es gibt bestimmt eine bessere Lösung. Hat mir jemand eine Lösung?

Gruss Renato

Hier mein SettingFragment

package ch.robbisoft.sakristanhilfe;

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

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);
//Eingabe anzeigen
onSharedPreferenceChanged(getPreferenceManager().getSharedPreferences(), "key_termin_titel");
onSharedPreferenceChanged(getPreferenceManager().getSharedPreferences(), "key_terminbeschrieb");
onSharedPreferenceChanged(getPreferenceManager().getSharedPreferences(), "key_terminort");
onSharedPreferenceChanged(getPreferenceManager().getSharedPreferences(), "key_vor");
onSharedPreferenceChanged(getPreferenceManager().getSharedPreferences(), "key_nach");
}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Preference wo = findPreference(key);
    if(wo != null) {
        if(key.compareTo("key_mute") != 0) {
            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();
}

}

Kommentieren
Beste Antwort
Rafael K.
  • Forum-Beiträge: 2.359

24.05.2023, 07:42:53 via Website

SharedPreferences hat auch eine Methode getAll().
Damit bekommst du eine Map<String, ?> und kannst einfach mit instanceof prüfen was für ein Typ es ist.

Crystal Math - Numbers On Speed -- Verkaufswert Rechner -- Trader Radar - Insider Trade News

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 650

24.05.2023, 08:15:49 via Website

Danke Rafael

Dacht ich mir, dass es besser geht.

Gruss Renato

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 650

28.05.2023, 20:50:19 via Website

Ciao Rafael

Ich bin mir nicht sicher ob ich das richtig mache. Meine Lösung sieht wie folgt aus:

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Map<String, ?> map_key;
    Object pool_key;
    Preference wo = findPreference(key);
    map_key = sharedPreferences.getAll();
    if(wo != null) {
        pool_key = map_key.get(key);
        if(pool_key.getClass().isInstance("class.java.lang.String")) {
            wo.setSummary(sharedPreferences.getString(key, " - "));
        }
    }
}

Oder geht es besser?

Gruss Renato

Hilfreich?
Kommentieren
Rafael K.
  • Forum-Beiträge: 2.359

29.05.2023, 21:18:30 via Website

Also vor allem würde ich es mit Kotlin machen.

Dann kannst du es sogar zu einem Einzeiler runterkochen.

findPreference(key).summary = sharedPreferences.all[key].toString()

Im Falle von Boolean liefert dann dann einfach true oder false als summary.

Crystal Math - Numbers On Speed -- Verkaufswert Rechner -- Trader Radar - Insider Trade News

Hilfreich?
Kommentieren