Question

So I am trying to update values in my timers.java class when a preference is changed. Here is the value in my timers.java

final boolean soundEnabledPref = sharedPref.getBoolean(spawnTimers.KEY_PREF_SOUND, false);

I have called that in the onCreate and if I change a preference, go back 2 screens to main.java and then relaunch timers.java the change will work, however if i just go into preferences and then back out to timers.java the change does not take effect

Here is my settingsFragment.java

import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.preference.PreferenceFragment;

public class settingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {

    public static final String KEY_PREF_SOUND_SETTINGS = "pref_key_sounds_settings";

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.preferences);

        onSharedPreferenceChanged(null, "");
    }

    @Override
    public void onResume() {
        super.onResume();
        // Set up a listener whenever a key changes
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onPause() {
        super.onPause();
        // Unregister the listener whenever a key changes
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
    {

        if (key.equals(KEY_PREF_SOUND_SETTINGS))
        {
            boolean soundEnabledPref = sharedPreferences.getBoolean(spawnTimers.KEY_PREF_SPAWNSOUND, false);
        }
    }



}

im guessing what i have in onSharedPreferenceChanged is not correct? Not really sure what i need to put into the If statement to get the value change of the boolean back to timers.java

any help would be greatly appreciated!

Thanks!

EDIT: someone posted an answer which sort of fixed the problem

I have changed my onSharedPreferencesChanged to

@Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
    {

        if (key.equals(KEY_PREF_SPAWN_SOUNDS))
        {
            CheckBoxPreference soundEnabledPref = (CheckBoxPreference)findPreference(KEY_PREF_SOUND_SETTINGS);
            soundEnabledPref.setChecked(sharedPreferences.getBoolean(spawnTimers.KEY_PREF_SPAWNSOUND, false));
        }
    }

This now updates the value and it is working, however, whenever i check or uncheck the box, it is throwing an error

01-24 13:35:36.558: E/AndroidRuntime(3681): FATAL EXCEPTION: main
01-24 13:35:36.558: E/AndroidRuntime(3681): Process: com.rcd.helper, PID: 3681
01-24 13:35:36.558: E/AndroidRuntime(3681): java.lang.ClassCastException: android.preference.PreferenceCategory cannot be cast to android.preference.CheckBoxPreference
01-24 13:35:36.558: E/AndroidRuntime(3681):     at com.rcd.helper.settingsFragment.onSharedPreferenceChanged(settingsFragment.java:43)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at android.app.SharedPreferencesImpl$EditorImpl.notifyListeners(SharedPreferencesImpl.java:475)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at android.app.SharedPreferencesImpl$EditorImpl.apply(SharedPreferencesImpl.java:385)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at android.preference.Preference.tryCommit(Preference.java:1372)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at android.preference.Preference.persistBoolean(Preference.java:1638)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at android.preference.TwoStatePreference.setChecked(TwoStatePreference.java:84)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at android.preference.TwoStatePreference.onClick(TwoStatePreference.java:70)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at android.preference.Preference.performClick(Preference.java:952)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:215)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at android.widget.AdapterView.performItemClick(AdapterView.java:299)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at android.widget.AbsListView.performItemClick(AbsListView.java:1113)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2904)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at android.widget.AbsListView$3.run(AbsListView.java:3638)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at android.os.Handler.handleCallback(Handler.java:733)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at android.os.Handler.dispatchMessage(Handler.java:95)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at android.os.Looper.loop(Looper.java:137)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at android.app.ActivityThread.main(ActivityThread.java:5083)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at java.lang.reflect.Method.invokeNative(Native Method)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at java.lang.reflect.Method.invoke(Method.java:515)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
01-24 13:35:36.558: E/AndroidRuntime(3681):     at dalvik.system.NativeStart.main(Native Method)
Was it helpful?

Solution

Why are you calling onSharedPreferenceChanged manually and passing it null and empty String as arguements?

Remove onSharedPreferenceChanged(null, "");from your code.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top