簡體   English   中英

在Android中持久地以編程方式添加首選項

[英]Persisting programmatically added preferences in android

基本上我想要的是:

->我有一些設置(當然)可以由用戶修改,其中一個是“多維數據集數量”
->還有其他設置取決於此設置(運動)
---->如果有一個多維數據集,則該設置被禁用(有效)
---->如果有兩個多維數據集,則有兩個移動選項,並且啟用了設置(這也可行)
---->如果有四個立方體,則需要為移動添加一個選擇,這就是我的問題:

我可以以編程方式更改ListPreference的值以添加此設置,但是:
->當用戶將附加值設置為“成對”時

->(s)他離開設置,正確讀取了設置
然而
->當用戶返回到設置時,該設置將設置為列表的第一個元素(已同步),而不是他之前做出的選擇
->我通過調用以下方法獲得的SharedPreferences實例會記住設置(配對):

    PreferenceManager.getDefaultSharedPreferences(context);

但是當再次移動到設置時,會顯示錯誤的設置值(沒人想要)

如何堅持以編程方式增加價值?

當然,原因是當恢復活動時我再次讀取了preferences.xml,但是我不知道如何在重新創建活動時保持用戶所做的選擇。

這是我的代碼:(這兩個方法很重要)

    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());
}

和我的preferences.xml(相關部分):

        <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" />

和strings.xml :(相關部分)

        <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>

該活動是從其他活動中調用的,如下所示:

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

歡迎任何幫助/評論/提示:)

S.

看來您正在修改臨時偏好。 要保存首選項並確保它保持不變,請使用sharedPreferencesTurbo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM