Wie hier beschrieben , unterteile ich PreferenceFragment und zeige es in einer Aktivität an. In diesem Dokument wird erklärt , wie Vorlieben Änderungen hören hier , aber nur , wenn Sie Unterklasse PreferenceActivity. Wie höre ich auf Änderungen der Einstellungen, da ich das nicht tue?
Ich habe versucht, OnSharedPreferenceChangeListener in meinem PreferenceFragment zu implementieren, aber es scheint nicht zu funktionieren ( onSharedPreferenceChanged
scheint nie aufgerufen zu werden).
Dies ist mein bisheriger Code:
SettingsActivity.java
public class SettingsActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Display the fragment as the main content.
getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
}
}
SettingsFragment.java
public class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener
{
public static final String KEY_PREF_EXERCISES = "pref_number_of_exercises";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
{
//IT NEVER GETS IN HERE!
if (key.equals(KEY_PREF_EXERCISES))
{
// Set summary to be the user-description for the selected value
Preference exercisesPref = findPreference(key);
exercisesPref.setSummary(sharedPreferences.getString(key, ""));
}
}
}
Einstellungen.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<EditTextPreference
android:defaultValue="15"
android:enabled="true"
android:key="pref_number_of_exercises"
android:numeric="integer"
android:title="Number of exercises" />
</PreferenceScreen>
Ist das PreferenceFragment überhaupt der richtige Ort, um auf Änderungen der Einstellungen zu warten, oder sollte ich dies innerhalb der Aktivität tun?
android
android-fragments
android-activity
sharedpreferences
android-preferences
XåpplI'-I0llwlg'I -
quelle
quelle
Antworten:
Ich glaube, Sie müssen nur die
Listener
in Ihrem registrieren / abmeldenPreferenceFragment
und es wird funktionieren.Je nachdem, was Sie tun möchten, müssen Sie möglicherweise keinen Listener verwenden. Änderungen an den Einstellungen werden
SharedPreferences
automatisch übernommen.quelle
getPreferenceManager
(wie Sie es getan haben) oder erhaltengetPreferenceScreen
? Was ist der Unterschied?getPreferenceManager
im Allgemeinen die bevorzugte Option.key
Parameter sein soll? Ich habe es nicht versucht, Sie haben ein Beispiel in Gunnars Antwort unten :onSharedPreferenceChanged(null, "")
. Es ist möglicherweise nicht für Ihre Bedürfnisse geeignet. Vielleicht sollten Sie Ihre Schlüssel derDie Lösung von antew funktioniert gut. Hier sehen Sie eine vollständige Voreinstellungsaktivität ab Android v11:
quelle
Alle anderen Antworten sind richtig. Aber diese Alternative gefällt mir besser, weil Sie sofort die Präferenzinstanz haben, die die Änderung verursacht hat.
quelle
onSharedPreferenceChanged ()
Sie mit in leicht auf die Voreinstellungsinstanz zugreifen könnenfindPreference(key)
. Vielleicht wird derSharedPreferences
Weg wegen der registrierenden / nicht registrierten Sache bevorzugt?Dies funktionierte für mich von PreferenceFragment.onCreate ()
quelle
Hier ist eine Möglichkeit, dies zu tun und mögliche Speicherlecks zu vermeiden:
quelle
Ein weiteres vollständiges Beispiel, damit Sie das gesamte Bild sehen.
quelle
Ich habe vor kurzem mein eigenes
PreferenceScreen
mit dem zusammengestelltPreferences API
, also dachte ich, ich würde mein eigenes vollständiges Beispiel beisteuern. Dies beinhaltet das Aktualisieren desSummary
neuen / geänderten Werts sowie das Abhören und Reagieren auf Änderungen.PS. Zur Beantwortung Ihrer letzte Frage: Um einen Standardwert zu zeigen , für die beim erstmaligen Erstellung der (vor jeder Änderung der Value), Sie könnten einfach die eingestellt auf einen Wert Ihrer Wahl, aus der Datei direkt - und dann, wenn es Wenn sich der Wert ändert , wird er automatisch mithilfe des in meinem Beispiel unten enthaltenen Codes aktualisiert. Persönlich verwende ich eine kurze Erklärung des als meine Initiale, Satz innerhalb meines , und dann , wenn der Wert nicht zum ersten Mal geändert, was es wird einfach den aktuellen Wert als die zeigt , von da an .. Wie auch immer
Summary
PreferenceScreen
android:summary
preferences.xml
Preference
Summary
preferences.xml
Summary
, hier ist mein volles Beispiel:
SettingsFragment.java
Ich hoffe das hilft!
Jedes positive Feedback wird sehr geschätzt, da ich ziemlich neu bei StackOverflow bin;)
Codieren!
quelle
onPause
, sollte dersuper.onPause()
Anrufer vor oder nach dem Abmelden des Hörers angerufen werden? Gibt es überhaupt einen Unterschied? Ich habe beide in zahlreichen Beispielen gesehensuper.onPause();
wahrscheinlich der beste Weg ist, dies zu tun .Sie müssen nur die angegebene Prefernce-Klasse in Ihrer
onResume()
Methode löschen . In meinem Fall habe ichSwitchPreference
class verwendet, daher würde der Code wie folgt aussehen: SettingsActivity.classVerwenden Sie dann in der Aktivität, in der Sie den
PrefernceFragment
Wert verwenden möchten , einfach dasSharedPreference
Objekt, um die Werte aufzurufen und auszulösen.quelle