简体   繁体   中英

Persisting programmatically added preferences in android

basically what I want is this:

-> I have some settings that (of course) can be modified by the user, on of it is the 'number of cubes'
-> There is an other setting which depends on this setting (movement)
----> if there is one cube the setting is disabled (this works)
----> if there are two cubes there are two options for movement and the setting is enabled (this works too)
----> if there are four cubes there needs to be a choice added for movement and here lays my problem:

I can programmatically change the value of the ListPreference to add this setting but:
-> when the user sets the added value "paired"
and
-> (s)he moves away from the settings, the setting is read correctly
however
-> when the users moves back to the settings the setting is set to the first element of the list(synchronized), not being the choice (s)he made earlier
-> the setting (paired) is remembered by the SharedPreferences instance which I get by calling:

    PreferenceManager.getDefaultSharedPreferences(context);

but when moving to the settings again shows the wrong value for the setting (which nobody wants)

How do I persist a programmatically added value?

Of course the reason is that I read the preferences.xml again when the Activity is resumed, but I don't know how to persist the choice made by the user when the Activity is recreated.

This is my code: (the two methods that matter)

    public class SettingsActivity extends PreferenceActivity implements
    SharedPreferences.OnSharedPreferenceChangeListener {

@Override
public void onCreate(Bundle savedInstanceState) {
    Log.d("SA", "onCreate");

    super.onCreate(savedInstanceState);

    addPreferencesFromResource(R.xml.preferences);

    updateLists();
}

private void updateLists() {
    Log.d("SA", "updateLists");
    Preference numberOfCubesPref = findPreference("numberOfCubes");
    Preference tupleTypePref = findPreference("tuple");
    Preference movementTypePref = findPreference("movement_type");
    Preference pictureDistributionPref = findPreference("distribution_of_pictures");

    ListPreference numberOfCubesListPref = (ListPreference) numberOfCubesPref;

    if(numberOfCubesListPref.getEntry() == null){
        numberOfCubesListPref.setValueIndex(0); 
    }

    numberOfCubesPref.setSummary(numberOfCubesListPref.getEntry());

    ListPreference movementTypeListPref = (ListPreference) movementTypePref;

    if(movementTypeListPref.getEntry() == null){
        movementTypeListPref.setValueIndex(0); 
    }

    if (numberOfCubesListPref.getEntry().equals("Four")) {
        movementTypePref.setEnabled(true);
        pictureDistributionPref.setEnabled(true);

        CharSequence[] oldEntries = movementTypeListPref.getEntries();

        if (oldEntries.length == 2) {

            Log.d("SA","length is twoo");

            CharSequence[] newEntries = new CharSequence[oldEntries.length + 1];

            newEntries[0] = oldEntries[0];
            newEntries[1] = "Paired";
            newEntries[2] = oldEntries[1];

            movementTypeListPref.setEntries(newEntries);

            CharSequence[] oldEntryValues = movementTypeListPref
                    .getEntryValues();

            CharSequence[] newEntryValues = new CharSequence[oldEntryValues.length + 1];

            newEntryValues[0] = oldEntryValues[0];
            newEntryValues[1] = "Paired";
            newEntryValues[2] = oldEntryValues[1];

            movementTypeListPref.setEntryValues(newEntryValues);
        }

    } else if (numberOfCubesListPref.getEntry().equals("Two")) {
        movementTypePref.setEnabled(true);
        pictureDistributionPref.setEnabled(true);

        CharSequence[] oldEntries = movementTypeListPref.getEntries();

        if (oldEntries.length == 3) {

            CharSequence[] newEntries = new CharSequence[oldEntries.length - 1];

            newEntries[0] = oldEntries[0];
            newEntries[1] = oldEntries[2];

            movementTypeListPref.setEntries(newEntries);

            CharSequence[] oldEntryValues = movementTypeListPref
                    .getEntryValues();

            CharSequence[] newEntryValues = new CharSequence[oldEntryValues.length - 1];

            newEntryValues[0] = oldEntryValues[0];
            newEntryValues[1] = oldEntryValues[2];

            movementTypeListPref.setEntryValues(newEntryValues);
        }
    } else {
        movementTypePref.setEnabled(false);
        pictureDistributionPref.setEnabled(false);
    }

    ListPreference pictureDistributionListPref = (ListPreference) pictureDistributionPref;
    ListPreference tupleTypeListPref = (ListPreference) tupleTypePref;

    if(tupleTypeListPref.getEntry() == null){
        tupleTypeListPref.setValueIndex(0); 
    }

    CharSequence[] entries = pictureDistributionListPref.getEntries();

    CharSequence target, replacement;

    if (tupleTypeListPref.getEntry().equals("Two of the same kind")) {
        target = "Triplet";
        replacement = "Pair";
    } else {
        target = "Pair";
        replacement = "Triplet";
    }

    for (int i = 0; i < entries.length; i++) {
        entries[i] = ((String) entries[i]).replace(target, replacement);
    }

    pictureDistributionListPref.setEntries(entries);

    if(pictureDistributionListPref.getEntry() == null){
        pictureDistributionListPref.setValueIndex(0); 
    }

    tupleTypePref.setSummary(tupleTypeListPref.getEntry());
    movementTypePref.setSummary(movementTypeListPref.getEntry());
    pictureDistributionPref.setSummary(pictureDistributionListPref.getEntry());
}

and my preferences.xml (relevant piece):

        <ListPreference
    android:dialogTitle="@string/choose_movement_type"
    android:enabled="false"
    android:entries="@array/movement_type_entries"
    android:entryValues="@array/movement_type_values"
    android:key="movement_type"
    android:title="@string/movement_type" />

and strings.xml: (relevant piece)

        <string name="movement_type">Movement type</string>
<string name="choose_movement_type">How do you want to control the cubes?</string>

<string-array name="movement_type_entries">
    <item>Synchronized</item>
    <item>Independent</item>
</string-array>

<string-array name="movement_type_values">
    <item>Synchronized</item>
    <item>Independent</item>
</string-array>

The activity is called from within an other activity like this:

            settings.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Intent myIntent = new Intent(MainActivity.this,
                    SettingsActivity.class);
            MainActivity.this.startActivity(myIntent);
        }
    });

any help/comments/tips are welcome :)

S.

it looks like you are modifying the preference temporary. to save the prefrences and be sure it remains the same, use sharedPreferencesTurbo

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM