Pier
Pier

Reputation: 784

How to change SwitchPreference title when is clicked

I'm working with my PreferenceActivity where I have a SwitchPreference to which I didn't assing a title using android:title="Title" because I'd like to change it whenever the Switch is clicked.

I've tried this way but didn't work. I also searched on SO related topics without solving my problem.

public class PrefsFragment extends PreferenceFragment {

    private SwitchPreference pref;

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

        addPreferencesFromResource(R.xml.settings);
        // Load the preferences from an XML resource

        pref = (SwitchPreference)findPreference("SWITCH");
        pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                if (newValue.toString().equals("SWITCH")) {
                    boolean test = (Boolean) newValue;
                    if (test) {
                        pref.setTitle("ChangedTitle");
                    } else {
                        pref.setTitle("DefaultTitle");
                    }
                }

                return true;
            }
        });
    }
}

settings.xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory
        android:title="Settings">

        <ListPreference
            android:key="yourPref"
            android:title="Title"
            android:dialogTitle="Select"
            android:summary="%s"
            android:defaultValue="4"
            android:entries="@array/titles"
            android:entryValues="@array/values"/>

    </PreferenceCategory>

    <PreferenceCategory
        android:title="Title">

        <SwitchPreference
            android:key="SWITCH"/>

    </PreferenceCategory>
</PreferenceScreen>

Could you help me please?

Upvotes: 3

Views: 4154

Answers (2)

Harsh Modani
Harsh Modani

Reputation: 221

The problem is with your OnSharedPreferenceChangeListener. Instead of this,

pref = (SwitchPreference)findPreference("SWITCH");
        pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                if (newValue.toString().equals("SWITCH")) {
                    boolean test = (Boolean) newValue;
                    if (test) {
                        pref.setTitle("ChangedTitle");
                    } else {
                        pref.setTitle("DefaultTitle");
                    }
                }

                return true;
            }
        });

Try this

SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
        if (s.equals("SWITCH")) {
            SwitchPreference sp = (SwitchPreference) findPreference(s);
            boolean test = sharedPreferences.getBoolean(s, false);
            if (test) { 
                sp.setTitle("ChangedTitle"); 
            } else { 
                sp.setTitle("DefaultTitle");
            }
        }
    }
}
    

Upvotes: 0

M. Palsich
M. Palsich

Reputation: 1818

Try calling preference.setTitle("YOUR TEXT"); within the listener callback, rather than pref.setTitle"YOUR TEXT"); The listener is passing in the preference that was changed.

Upvotes: 0

Related Questions