Question

My trouble is that when I'm trying to select an item from listpreference, the summary changes to the selected array key from array settings_listofitems_keys.
But I want to set the summary to a user readable format from array settings_listofitems_values on layout and at the same time save that value from settings_listofitems_keys as a parameter in preferences.

Xml arrays file:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="settings_listofitems_values">
        <item>Green</item>
        <item>Orange</item>
    </string-array> 
    <string-array name="settings_listofitems_keys">
        <item>1</item>
        <item>2</item>
    </string-array>  
</resources>

Xml layout file:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <PreferenceCategory android:title="@string/settings_select_horo" >
        <ListPreference
            android:defaultValue="@string/settings_selectitem"
            android:key="preferenceitem"
            android:entries="@array/settings_listofitems_values"
            android:summary="@string/settings_plsselect"
            android:entryValues="@array/settings_listofitems_keys"
            android:title="@string/settings_plsselect" />
    </PreferenceCategory>
</PreferenceScreen>

Code:

public class UserSettingActivity extends PreferenceActivity implements
        OnPreferenceChangeListener {
    private static final String APP_PREFERENCES = "mypref";
    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.layout.activity_preferences);
            SharedPreferences settings = getSharedPreferences(APP_PREFERENCES,
                        Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = settings.edit();
            ListPreference myid = (ListPreference)
                        findPreference("preferenceitem");
            myid.setOnPreferenceChangeListener(this);
            editor.commit();
    }
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        preference.setSummary(newValue.toString());
        return true;
    }
}

Any help is highly appreciated. I can also be a good example for newbies =)

Était-ce utile?

La solution

All this with editors and commits and preferences does nothing - change it !

public class UserSettingActivity extends PreferenceActivity implements
        OnPreferenceChangeListener {
    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.layout.activity_preferences);
            ListPreference myid = (ListPreference)
                        findPreference("preferenceitem");
            myid.setOnPreferenceChangeListener(this);
    }
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        preference.setSummary(newValue.toString()); // that's ok
        return true;
    }
}

Here is your issue - you must delete the summary line:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <PreferenceCategory android:title="@string/settings_select_horo" >
        <ListPreference
            android:defaultValue="@string/settings_selectitem"
            android:key="preferenceitem"
            android:entries="@array/settings_listofitems_values"
            <!-- android:summary="@string/settings_plsselect"-->
            android:entryValues="@array/settings_listofitems_keys"
            android:title="@string/settings_plsselect" />
    </PreferenceCategory>
</PreferenceScreen>

Autres conseils

Instead of

public class UserSettingActivity extends PreferenceActivity implements OnPreferenceChangeListener {
    private static final String APP_PREFERENCES = "mypref";
    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.layout.activity_preferences);
            SharedPreferences settings = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = settings.edit();
            ListPreference myid = (ListPreference) findPreference("preferenceitem");
            myid.setOnPreferenceChangeListener(this);
            editor.commit();
    }
    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        preference.setSummary(newValue.toString());
        return true;
    }

Try using this:

public class UserSettingActivity extends PreferenceActivity {
    private static final String APP_PREFERENCES = "mypref";
    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.layout.activity_preferences);
        ListPreference myid = (ListPreference) findPreference("preferenceitem");
        myid.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                int index = ((ListPreference) preference).findIndexOfValue(newValue.toString());
                preference.setSummary(index >= 0 ? ((ListPreference) preference).getEntries()[index] : null);
                return true;
            }
        });
    }
}

Hope this helps :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top